UWAGA! Wyczyścić listę mapowanie_osob_bn_pbl_po_imporcie (za dużo niepoprawnych relacji pbl-bn po ostatnim imporcie) Przed rozpoczęciem pracy zaktualizuj zgodnie z obecnym stanem bazy listę książek na dysku za poprzedni rocznik. Przed rozpoczęciem pracy wyszukaj frazy “bezpiecznik” i “aktualizacja”.

options(java.parameters = "-Xmx32000m")
Komunikat ostrzegawczy:
package ‘RJDBC’ was built under R version 3.6.3 
options(scipen = 999)
pacman::p_load(utf8,googlesheets4,zoo,stringr,splitstackshape,plyr,dplyr,sqldf,stringdist,fuzzyjoin,data.table,svMisc,tidyverse,RJDBC,arrangements,tokenizers,openxlsx,jsonlite)
`%notin%` <- Negate(`%in%`)
#połączenie z bazą PBL
jdbcDriver =JDBC("oracle.jdbc.OracleDriver",classPath=paste("C:/Users/",employee_name,"/Downloads/ojdbc6.jar",sep = ""))
PBL <- dbConnect(jdbcDriver, "jdbc:oracle:thin:@//pbl.ibl.poznan.pl:1521/xe", "IBL_SELECT", "CR333444")
bn_ks <- chunk1
#wczytanie listy utożsamionych twórców z autorami BN
#bezpiecznik: użyć sheets_auth() z konsoli
pbl_viaf <- sheets_read(ss = "1cEz73dGN2r2-TTc702yne9tKfH9PQ6UyAJ2zBSV6Jb0") %>%
  filter(czy_ten_sam!="nie") %>%
  select(pbl_id, BN_id, BN_name) %>%
  mutate(BN_name = str_replace_all(BN_name,"\\|\\(", " ("),
         BN_name = str_replace_all(BN_name, "\\;\\|", "; ")) %>%
  cSplit(.,"BN_name",sep = "|",direction = "long") %>%
  filter(BN_name!="")
Reading from 'mapowanie_osob_bn_pbl'
pbl_viaf2 <- sheets_read(ss = "1_Bhwzo0xu4yTn8tF0ZNAZq9iIAqIxfcrjeLVCm_mggM") %>%
  filter(czy_ten_sam!="nie") %>%
  select(pbl_id, BN_id, BN_name) %>%
  mutate(BN_name = str_replace_all(BN_name,"\\|\\(", " ("),
         BN_name = str_replace_all(BN_name, "\\;\\|", "; ")) %>%
  cSplit(.,"BN_name",sep = "|",direction = "long") %>%
  filter(BN_name!="")
Reading from 'mapowanie_osob_bn_pbl_druga_czesc'
pbl_viaf3 <- sheets_read(ss = "1L-7Zv9EyLr5FeCIY_s90rT5Hz6DjAScCx6NxfuHvoEQ") %>%
  filter(czy_ten_sam!="nie") %>%
  select(pbl_id, BN_id, BN_name) %>%
  mutate(BN_name = str_replace_all(BN_name,"\\|\\(", " ("),
         BN_name = str_replace_all(BN_name, "\\;\\|", "; ")) %>%
  cSplit(.,"BN_name",sep = "|",direction = "long") %>%
  filter(BN_name!="")
Reading from 'mapowanie_osob_bn_pbl_po_imporcie'
pbl_viaf <- rbind(pbl_viaf,pbl_viaf2, pbl_viaf3) %>%
  arrange(pbl_id) %>%
  unique()
remove(pbl_viaf2)
remove(pbl_viaf3)

#bezpiecznik!
#sprawdź, czy jedno hasło bn nie zasila kilku haseł twórców pbl

# pbl_viaf_test1 <- sheets_read(ss = "1cEz73dGN2r2-TTc702yne9tKfH9PQ6UyAJ2zBSV6Jb0") %>%
#  filter(czy_ten_sam!="nie") %>%
#  select(pbl_id, BN_id, BN_name)
# pbl_viaf_test2 <- sheets_read(ss = "1_Bhwzo0xu4yTn8tF0ZNAZq9iIAqIxfcrjeLVCm_mggM") %>%
#  filter(czy_ten_sam!="nie") %>%
#  select(pbl_id, BN_id, BN_name)
# pbl_viaf_test3 <- sheets_read(ss = "1L-7Zv9EyLr5FeCIY_s90rT5Hz6DjAScCx6NxfuHvoEQ") %>%
#   filter(czy_ten_sam!="nie") %>%
#   select(pbl_id, BN_id, BN_name)
# pbl_viaf_test <- rbind(pbl_viaf_test1,pbl_viaf_test2,pbl_viaf_test3) %>%
#  arrange(pbl_id) %>%
#  unique()
# 
# count <- as.data.frame(table(pbl_viaf_test$BN_id))
# pbl_viaf_test_1 <- merge(pbl_viaf_test,count,by.x = "BN_id",by.y = "Var1",all.x = TRUE) %>%
#  unique()

#bezpiecznik!
#w obiekcie pbl_viaf_test_1 przy frekwencji większej niż 1 należy przeanalizować grupy, jeśli do tego samego identyfikatora pbl przypisane sa różne identyfikatory bn, które jednak opisują tę samą osobę, to wszystko jest okej; w przeciwnym razie trzeba przeprowadzić korektę w plikach "mapowanie_osob_bn_pbl"

# count2 <- as.data.frame(table(pbl_viaf_test$pbl_id))
# pbl_viaf_test_2 <- merge(pbl_viaf_test,count2,by.x = "pbl_id",by.y = "Var1",all.x = TRUE) %>%
#  unique()

#bezpiecznik!
#dla grupy o frekwencji większej niż 1 sprawdź, czy w zestawie identyfikatorów bn nie ma rażących błędów; w przeciwnym razie trzeba przeprowadzić korektę w plikach "mapowanie_osob_bn_pbl"

#utożsamianie po nazewnictwie z informacją o dziale
tworca_i_dzial <- dbGetQuery(PBL,
                             "select tw.tw_tworca_id \"pbl_id\", dz.dz_dzial_id||'|'||dz.dz_nazwa \"osoba_pbl_dzial_id_name\"
                              from pbl_tworcy tw
                              full join pbl_dzialy dz on dz.dz_dzial_id=tw.tw_dz_dzial_id")

#listy nazwisk BN ze zbioru
#100
marc_field_100 <- bn_ks %>%
  select(id,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(bn_ks$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
marc_field_100 <- marc_field_100 %>%
  select(id,`$a`,`$d`,`$c`) %>%
  mutate(name = ifelse(!is.na(`$c`)&substr(`$c`,nchar(`$c`),nchar(`$c`))==";",paste(`$a`,`$c`,`$d`,sep = " "),ifelse(!is.na(`$d`),paste(`$a`,`$d`,sep = " "),as.character(`$a`)))) %>%
  select(id,name) %>%
  mutate(name = str_replace(name,"(\\))(\\.$)","\\1"),
         name = str_replace(name, "([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)","\\1"))

osoba_bn_100_pbl <- marc_field_100 %>%
  unique() %>%
  inner_join(.,pbl_viaf,by = c("name" = "BN_name")) %>%
  select(1:3) %>%
  left_join(.,tworca_i_dzial,by = "pbl_id") %>%
  select(id,osoba_pbl_dzial_id_name) %>%
  group_by(id) %>%
  mutate(osoba_bn_autor = paste(unique(osoba_pbl_dzial_id_name),collapse = "~")) %>%
  select(-osoba_pbl_dzial_id_name) %>%
  ungroup() %>%
  unique()
Column `name`/`BN_name` joining character vector and factor, coercing into character vector
#600
marc_field_600 <- bn_ks %>%
  select(id,X600)%>%
  filter(X600!="") %>%
  mutate(X600=str_replace_all(X600,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X600",sep = "~",direction = "long") %>%
  filter(X600!="") %>%
  mutate(X600=str_remove_all(X600,"^\\|")) %>%
  mutate(indicator = str_replace_all(X600,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(bn_ks$X600,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_600)[1]))
colnames(empty_table) <-subfield_list
marc_field_600<-cbind(marc_field_600,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")
x <- 1:length(subfield_list)

for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_600$X600 <- str_replace(marc_field_600$X600,subfield_list_char[i],"|\\1")
}
Progress:  1 on 13  Progress:  2 on 13  Progress:  3 on 13  Progress:  4 on 13  Progress:  5 on 13  Progress:  6 on 13  Progress:  7 on 13  Progress:  8 on 13  Progress:  9 on 13  Progress: 10 on 13  Progress: 11 on 13  Progress: 12 on 13  Progress: 13 on 13  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_600[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_600$X600),str_replace_all(gsub(string,"\\3",marc_field_600$X600),"\\${2}.", "~"),NA)
}
Progress:  1 on 13  Progress:  2 on 13  Progress:  3 on 13  Progress:  4 on 13  Progress:  5 on 13  Progress:  6 on 13  Progress:  7 on 13  Progress:  8 on 13  Progress:  9 on 13  Progress: 10 on 13  Progress: 11 on 13  Progress: 12 on 13  Progress: 13 on 13  
marc_field_600 <- marc_field_600 %>%
  select(id,`$a`,`$d`,`$c`) %>%
  mutate(name = ifelse(!is.na(`$c`)&substr(`$c`,nchar(`$c`),nchar(`$c`))==";",paste(`$a`,`$c`,`$d`,sep = " "),ifelse(!is.na(`$d`),paste(`$a`,`$d`,sep = " "),as.character(`$a`)))) %>%
  select(id,name) %>%
  mutate(name = str_replace(name,"(\\))(\\.$)","\\1"),
         name = str_replace(name, "([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)","\\1"))
osoba_bn_600_pbl <- marc_field_600 %>%
  unique() %>%
  inner_join(.,pbl_viaf,by = c("name" = "BN_name")) %>%
  select(1:3) %>%
  left_join(.,tworca_i_dzial,by = "pbl_id") %>%
  select(id,osoba_pbl_dzial_id_name) %>%
  group_by(id) %>%
  mutate(osoba_bn_temat = paste(unique(osoba_pbl_dzial_id_name),collapse = "~")) %>%
  select(-osoba_pbl_dzial_id_name) %>%
  ungroup() %>%
  unique()
Column `name`/`BN_name` joining character vector and factor, coercing into character vector
bn_ks <- bn_ks %>%
  full_join(.,osoba_bn_100_pbl,by = "id") %>%
  full_join(.,osoba_bn_600_pbl,by = "id")

#bezpiecznik!
#sprawdzić
#jeśli obiekt bezpiecznik będzie miał jakiekolwiek wiersze, to oznacza, że w pliku "mapowanie_osob_bn_pbl" jest wiersz z twórcą, którego nie ma w bazie lub jego identyfikator jest błędny
#jeśli obiekt bezpiecznik jest pusty - to wszystko okej
# sprawdz czy id tworcy z ktorejs tabeli na dysku istnieje w bazie oracle, jesli nie, wklej id tworcy z oracla do tabeli lub - jeśli nie ma takiego twórcy w bazie usuń wiersz w tabeli. Następnie dopisz fragment kodu, by usunąć kolumny osoba_bn_autor i osoba_bn_temat (po tej operacji usuń dopisany kod) i uruchom chunk ponownie

# bn_ks <- bn_ks %>%
#   select(-osoba_bn_autor,-osoba_bn_temat)

bezpiecznik <- bn_ks %>% 
  filter(osoba_bn_autor=="NA")
chunk2 <- bn_ks
#wskazanie interesujących PBL dziedzin wiedzy po UKD i określenie typu UKD
bn_ks <- chunk2 %>%
  mutate(dziedzina_PBL = ifelse(str_detect(X080,"(?<=\\$a|:|\\[|\\+|\\()(82)"),"ukd_lit",
                                ifelse(str_detect(X080,"(?<=\\$a|:|\\[|\\+)(791)")|str_detect(X080,"(?<=\\$a|:)(792)")|str_detect(X080,"\\$a7\\.09"),"ukd_tfrtv",
                                       ifelse(str_detect(X080,"(?<=\\$a01)(\\(|\\/|2|4|5|9)")|str_detect(X080,"(?<=\\$a|\\[])(050)")|str_detect(X080,"(?<=\\$a|:|\\[|\\+|\\()(811\\.162)"),"ukd_biblio",
                                              ifelse(str_detect(X080,"\\$a002")|str_detect(X080,"(?<=\\$a|:)(305)")|str_detect(X080,"(?<=\\$a39|:39)(\\(438\\)|8\\.2)")|str_detect(X080,"(?<=\\$a|:)(929[^\\.]051)")|str_detect(X080,"(?<=\\$a|:)(929[^\\.]052)"),"ukd_pogranicze","bez_ukd_PBL")))))

#ograniczenie rekordów z ukd językowym
biblio <- bn_ks %>% 
  select(id, X008, X009, X015, X041, X044, X080, X100, X245, X246, X250, X260, X300, X380, X386, X490, X500, X501, X546, X600, X650, X655, X700, X710, X800, X830, rok, BN_URL, osoba_bn_autor, osoba_bn_temat, dziedzina_PBL) %>% 
  filter(dziedzina_PBL=="ukd_biblio")
dobre_biblio <- biblio %>% 
  filter(!grepl("Podręczniki dla dzieci|Podręczniki dla szkół podstawowych",X655),
         !grepl("szkoły podstawowe|rozmówki|nauczanie|logopedia",X650,ignore.case = TRUE),
         !grepl("811\\.162\\.1\\(075\\.2\\)|811\\.162\\'24\\(078\\)",X080),
         !grepl("ćwiczenia i zadania|poradniki dla nauczycieli|słownik.*?\\-polski|słownik polsko\\-|Słowniki dla dzieci",X655,ignore.case = TRUE),
         !(grepl("Podręczniki",X655)&grepl("Kształcenie nauczycieli",X650)))
dobre_biblio2 <- biblio %>% 
  filter(!(is.na(osoba_bn_autor)&is.na(osoba_bn_temat)))
dobre_biblio <- dobre_biblio %>% 
  bind_rows(dobre_biblio2 %>% filter(id %notin% dobre_biblio$id))
zle_biblio <- biblio %>% 
  filter(id %notin% dobre_biblio$id)
bn_ks$dziedzina_PBL[bn_ks$id %in% zle_biblio$id] <- NA

#wskazanie interesujących PBL rekordów bez UKD, które są w kluczu PBL
bez_ukd_ale_PBL <- bn_ks %>%
  select(id, X080, X650, X655, osoba_bn_autor, osoba_bn_temat, dziedzina_PBL) %>%
  filter(dziedzina_PBL == "bez_ukd_PBL"&X080==""&is.na(osoba_bn_autor)&is.na(osoba_bn_temat)) %>%
  mutate(bez_ukd_ale_PBL = grepl("literat|literac|pisar|bajk|dramat|epigramat|esej|felieton|film|komedi|nowel|opowiadani|pamiętnik|poemiks|poezj|powieść|proza|reportaż|satyr|wspomnieni|Scenariusze zajęć|Podręczniki dla gimnazjów|teatr|Nagrod|aforyzm|baśń|baśnie|polonijn|dialogi|fantastyka naukowa|legend|pieśń|poemat|przypowieś|honoris causa|filologi|kino polskie|pieśni|interpretacj",X650, ignore.case = TRUE)|grepl("literat|literac|pisar|bajk|dramat|epigramat|esej|felieton|film|komedi|nowel|opowiadani|pamiętnik|poemiks|poezj|powieść|proza|reportaż|satyr|wspomnieni|Scenariusze zajęć|Podręczniki dla gimnazjów|teatr|Nagrod|aforyzm|baśń|baśnie|polonijn|dialogi|fantastyka naukowa|legend|pieśń|poemat|przypowieś|honoris causa|filologi|kino polskie|pieśni|interpretacj",X655,ignore.case = TRUE)) %>%
  filter(bez_ukd_ale_PBL == TRUE) %>%
  select(id) %>%
  mutate(bez_ukd_ale_PBL = "tak")

bn_ks <- bn_ks %>%
  full_join(.,bez_ukd_ale_PBL,by = "id")

#Biblia
biblia <- bn_ks %>% 
  filter(grepl("biblia", X630, ignore.case = TRUE), 
         grepl("analiza i interpretacja|edycja krytyczna|materiały konferencyjne", X655, ignore.case = TRUE)) %>% 
  select(id) %>% 
  mutate(czy_biblia = "tak")

bn_ks <- bn_ks %>%
  full_join(biblia,by = "id")

#wspomnienia,pamiętniki,literatura podróżnicza,reportaż
wspomnienia <- bn_ks %>%
  mutate(czy_wspomnienia_reportaz = ifelse(str_detect(X655,"Pamiętniki i wspomnienia")|str_detect(X655,"Literatura podróżnicza")|str_detect(X655,"Pamiętniki")|str_detect(X655,"Reportaż")|str_detect(X655,"Relacja z podróży"),"tak",NA)) %>%
  select(id,czy_wspomnienia_reportaz) %>%
  unique()
bn_ks <- bn_ks %>%
  full_join(.,wspomnienia,by = "id")

#słowa literackie w polu 245
rekordy_slowa <- sqldf("select *
                    from bn_ks a
                    where LOWER(a.X245) like ('%'||'pisar'||'%')
                   or LOWER(a.X245) like ('%'||'literat'||'%')
                   or LOWER(a.X245) like ('%'||'literac'||'%')
                   or LOWER(a.X245) like ('%'||'teatr'||'%')
                   or LOWER(a.X245) like ('%'||'film'||'%')
                   or LOWER(a.X245) like ('%'||'dramat'||'%')
                   or LOWER(a.X245) like ('%'||'interpretacj'||'%')") %>%
  select(id) %>%
  mutate(slowa_literackie = "tak") %>%
  unique()
bn_ks <- bn_ks %>%
  full_join(.,rekordy_slowa,by = "id")

bn_ok <- bn_ks %>%
  filter(!((is.na(osoba_bn_autor)&is.na(osoba_bn_temat))&dziedzina_PBL=="bez_ukd_PBL"&is.na(bez_ukd_ale_PBL)&is.na(czy_wspomnienia_reportaz)&is.na(slowa_literackie)&is.na(czy_biblia)))

#interpretacje nieliterackie
zle_interpretacje <- bn_ok %>% 
  filter(grepl("interpretacj",X245,ignore.case = TRUE)|grepl("interpretacj",X650,ignore.case = TRUE)|grepl("interpretacj",X245,ignore.case = TRUE)) %>% 
  filter(grepl("\\$a336|\\$a342|\\$a32|\\$a551|\\$a616|\\$a159\\.961",X080)|grepl("prawn|handl|handel|kodeks|prac|ustaw|administrac|spółka|spółek|prawa|podatk",X655,ignore.case = TRUE)|grepl("prawn|handl|handel|kodeks|prac|ustaw|administrac|spółka|spółek|prawa|podatk",X650,ignore.case = TRUE)|grepl("prawn|handl|handel|kodeks|ustaw|administrac|spółka|spółek|prawa|podatk",X245,ignore.case = TRUE))

bn_ok <- bn_ok %>% 
  filter(id %notin% zle_interpretacje$id)

#usuwanie zdublowanych książek
#020
marc_field_020 <- bn_ok %>%
  select(id,X020)%>%
  filter(X020!="") %>%
  mutate(X020=str_replace_all(X020,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X020",sep = "~",direction = "long") %>%
  filter(X020!="") %>%
  mutate(X020=str_remove_all(X020,"^\\|")) %>%
  mutate(indicator = str_replace_all(X020,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(bn_ok$X020,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_020)[1]))
colnames(empty_table) <-subfield_list
marc_field_020<-cbind(marc_field_020,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_020$X020 <- str_replace(marc_field_020$X020,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_020[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_020$X020),str_replace_all(gsub(string,"\\3",marc_field_020$X020),"\\${2}.", "~"),NA)
}
marc_field_020 <- marc_field_020 %>%
  select(id,isbn=`$a`)

distance1 <- bn_ok %>%
  filter(!grepl("\\$n",X245)) %>%
  left_join(.,marc_field_020,by="id") %>%
  mutate(porownanie = paste(isbn,substr(str_to_lower(str_replace_all(X245, "\\W", "")),4,14),str_extract(X300,"(?<=\\$a)(.*?)(?=,| )"),sep = "|"))

count <- as.data.frame(table(distance1$porownanie))

distance1 <- merge(distance1,count,by.x = "porownanie",by.y = "Var1",all.x = TRUE) %>%
  select(porownanie,Freq,2:155) %>%
  arrange(-Freq,porownanie) %>%
  select(porownanie,Freq,id) %>%
  cSplit(.,"porownanie",sep = "|",direction = "wide") %>% 
  arrange(porownanie_2,porownanie_3,porownanie_1,-Freq,id)
count <- as.data.frame(table(distance1$porownanie_2,distance1$porownanie_3)) %>% 
  filter(Freq>0)
distance1 <- distance1 %>% 
  left_join(.,count,by=c("porownanie_2"="Var1","porownanie_3"="Var2")) %>% 
  arrange(porownanie_2,porownanie_3,-Freq.y,porownanie_1,-Freq.y,id) %>% 
  group_by_at(vars(4:6)) %>% 
  fill(porownanie_1) %>% 
  ungroup() %>% 
  unique() %>% 
  select(-Freq.y) %>% 
  rename(Freq = Freq.x)

#poszukanie dystansu Levenshteina == 1 przy takim samym ISBN
distance2 <- distance1 %>%
  filter(!is.na(porownanie_1)) %>%
  group_by(porownanie_1) %>%
  mutate(Freq = paste(Freq,collapse = "|"),
         id = paste(id,collapse = "|"),
         porownanie_2 = paste(porownanie_2,collapse = "|"),
         porownanie_3 = paste(porownanie_3,collapse = "|")) %>%
  ungroup() %>%
  unique() %>%
  mutate(ile = str_count(porownanie_2,"\\|")+1) %>%
  arrange(-ile) %>%
  mutate(id_grupy = 1:lengths(.)) %>%
  filter(ile>1) %>%
  cSplit(.,c("Freq","id","porownanie_2","porownanie_3"),sep = "|",direction = "long") %>%
  unique() %>%
  filter(!is.na(id))

permutations <- data.frame(stringsAsFactors = FALSE)
x <- 1:max(distance2$id_grupy)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  distance3 <- as.vector(unlist(distance2 %>% filter(id_grupy==i) %>% select(porownanie_2)))
  iteration <- as.data.frame(permutations(distance3,2)) %>%
    mutate(id_grupy = i)
  y <- 1:length(iteration$V1)
  for (j in y) {
    progress(match(j,y), max.value = length(y))
    iteration$distance[j] <- adist(iteration$V1[j],iteration$V2[j])
  }
  permutations <- rbind(permutations,iteration)
}

permutations <- permutations %>%
  filter(distance<=1)

distance2 <- distance2 %>%
  filter(id_grupy %in% permutations$id_grupy) %>%
  select(id,id_grupy)
#połączyć distance2 z distance1, żeby wydobyć pełną listę zdublowanych książek
duble_ksiazek <- distance1 %>%
  unite("porownanie", porownanie_1:porownanie_3, sep = "|") %>%
  filter(Freq>1) %>%
  full_join(.,distance2,by="id")

duble_ksiazek$same <- cumsum(!duplicated(duble_ksiazek$porownanie))

duble_ksiazek <- duble_ksiazek %>%
  arrange(id_grupy,same) %>%
  mutate(id_grupy_dubli = ifelse(!is.na(id_grupy),as.character(id_grupy),paste("x",same,sep = ""))) %>%
  select(id,id_grupy_dubli) %>%
  arrange(id_grupy_dubli)

duble_ksiazek$id_grupy_dubli <- cumsum(!duplicated(duble_ksiazek$id_grupy_dubli))
#uzupełnienie całego zbioru o informację o dublu, wydobycie dubli do osobnego pliku i usuniecie ich z głównego pliku z rekordami bn; wskazanie listy interesujących pól
bn_ok <- bn_ok %>%
  left_join(.,duble_ksiazek,by="id") %>%
  select(id, X008, X009, X015, X041, X044, X080, X100, X245, X246, X250, X260, X300, X380, X386, X490, X500, X501, X546, X600, X650, X655, X700, X710, X800, X830, rok, BN_URL, osoba_bn_autor, osoba_bn_temat, dziedzina_PBL, bez_ukd_ale_PBL, czy_wspomnienia_reportaz, slowa_literackie, czy_biblia, id_grupy_dubli)

duble_ksiazek <- bn_ok %>%
  filter(!is.na(id_grupy_dubli)) %>%
  arrange(id_grupy_dubli)

bn_ok <- bn_ok %>%
  filter(is.na(id_grupy_dubli))
#wpisanie w zdublowane rekordy jak największej ilości danych (suma wszystkich dubli)
duble_ksiazek <- duble_ksiazek %>%
  arrange(id_grupy_dubli,-nchar(X015))
duble_ksiazek[is.na(duble_ksiazek)] <- ""
duble_naprawione <- data.frame(stringsAsFactors = FALSE)
x <- 1:max(duble_ksiazek$id_grupy_dubli)
y <- c(4:27,29:34)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  iteration <- duble_ksiazek %>%
    filter(id_grupy_dubli==i)
  for (j in y) {
    if (j==30) {
      iteration[,j] <- iteration[,j][nchar(iteration[,j])==min(nchar(iteration[,j]))][1]
    } else {
        iteration[,j] <- iteration[,j][nchar(iteration[,j])==max(nchar(iteration[,j]))][1]
      }
  }
  duble_naprawione <- rbind(duble_naprawione,iteration)
}
#pozostawienie pojedynczych wierszy dla książek
duble_naprawione <- duble_naprawione[!duplicated(duble_naprawione$id_grupy_dubli),]
duble_naprawione <- duble_naprawione %>%
  mutate(osoba_bn_autor = ifelse(osoba_bn_autor!="",as.character(osoba_bn_autor),NA),
         osoba_bn_temat = ifelse(osoba_bn_temat!="",as.character(osoba_bn_temat),NA),
         dziedzina_PBL = ifelse(dziedzina_PBL!="",as.character(dziedzina_PBL),NA),
         bez_ukd_ale_PBL = ifelse(bez_ukd_ale_PBL!="",as.character(bez_ukd_ale_PBL),NA),
         czy_wspomnienia_reportaz = ifelse(czy_wspomnienia_reportaz!="",as.character(czy_wspomnienia_reportaz),NA),
         slowa_literackie = ifelse(slowa_literackie!="",as.character(slowa_literackie),NA),)
#połączenie unikatowych książek z dubli z całym zbiorem
bn_ok <- bn_ok %>%
  bind_rows(.,duble_naprawione) %>%
  select(-id_grupy_dubli)

#usunięcie zagranicznych zapisów, które nie są polonikami 
#na podstawie braku wystąpień frazy "pol" w polach MARC
nie_poloniki <- bn_ok %>%
  filter(if (X501=="") !grepl("pl",substr(X008,16,18))) %>%
  filter(!grepl("pol",substr(X008,36,38))) %>%
  filter(!grepl("pol",X041)) %>%
  filter(!grepl("pl",X044)) %>%
  filter(!grepl("pol",X500,ignore.case = TRUE)) %>%
  filter(!grepl("pol",X501,ignore.case = TRUE)) %>%
  filter(!grepl("pol",X546,ignore.case = TRUE)) %>%
  select(id) %>%
  mutate(czy_polonik = "nie") %>%
  unique()

bn_ok <- bn_ok %>%
  full_join(.,nie_poloniki,by = "id") %>%
  select(id, X008, X009, X041, X044, X080, X100, X245, X246, X250, X260, X300, X380, X386, X490, X500, X501, X500, X546, X600, X650, X655, X700, X710, X800, X830, rok, BN_URL, osoba_bn_autor, osoba_bn_temat, dziedzina_PBL, bez_ukd_ale_PBL, czy_wspomnienia_reportaz, slowa_literackie, czy_polonik, czy_biblia) %>%
  unique()
#wskazanie niepoloników i usunięcie ze zbioru
nie_poloniki <- bn_ok %>%
  filter(czy_polonik=="nie") %>%
  filter(is.na(osoba_bn_autor)|is.na(osoba_bn_temat)|!(osoba_bn_autor %in% c("148|Hasła osobowe (literatura polska)","430|Hasła osobowe (Ludzie teatru i filmu)"))|!(osoba_bn_temat %in% c("148|Hasła osobowe (literatura polska)","430|Hasła osobowe (Ludzie teatru i filmu)")))
bn_ok <- sqldf("select *
               from bn_ok a
               where a.id not in (select b.id from nie_poloniki b)") %>%
  select(-czy_polonik)

#usunięcie książek zabawek, do kolorowania, dla małych dzieci, z naklejkami, które nie mają żadnego deskryptora gatunkowego
ks_zabawki <- bn_ok %>% 
  filter((str_count(X655,"\\$a")==1&grepl("Książka zabawka|Książki dla małych dzieci|Książka do kolorowania|Książka z naklejkami|Książki dla przedszkolaków|Wydawnictwa dla dzieci",X655))|str_count(X655,"\\$a")==2&grepl("Książka obrazkowa",X655)&grepl("Książki dla małych dzieci",X655)|str_count(X655,"\\$a")==2&grepl("Książka do kolorowania",X655)&grepl("Publikacje dla dzieci",X655)|str_count(X655,"\\$a")==2&grepl("Książki zabawki",X655)&grepl("Wycinanki",X655)|str_count(X655,"\\$a")==2&grepl("Książki dla małych dzieci",X655)&grepl("Publikacje dla dzieci",X655))

bn_ok <- sqldf("select *
               from bn_ok a
               where a.id not in (select b.id from ks_zabawki b)")

# usunięcie książek dotyczących glottodydaktyki
ks_glottodydaktyka <- bn_ok %>% 
  filter(str_detect(tolower(X490), "język polski dla cudzoziemców|czytaj po polsku : materiały pomocnicze do nauki języka polskiego jako obcego|testy ogólne i specjalistyczne z języka polskiego jako obcego|kultura i język polski dla cudzoziemców|czytaj po polsku") | str_detect(tolower(X830), "język polski dla cudzoziemców|kultura i język polski dla cudzoziemców|czytaj po polsku"))

bn_ok <- sqldf("select *
               from bn_ok a
               where a.id not in (select b.id from ks_glottodydaktyka b)")

chunk3 <- bn_ok
bn_ok <- chunk3
Komunikaty ostrzegawcze:
1: Unknown or uninitialised column: 'drugi_autor'. 
2: Unknown or uninitialised column: 'drugi_autor'. 
3: Unknown or uninitialised column: 'drugi_autor'. 
4: Unknown or uninitialised column: 'drugi_autor'. 
5: Unknown or uninitialised column: 'drugi_autor'. 
6: Unknown or uninitialised column: 'drugi_autor'. 
#pobranie starych list książek z importu
#aktualizacja - uzupełnij ostatni brakujący zaimportowany rocznik
listy_2011 <- sheets_read(ss = "1s22ClRxlrPHaAXi_n_JJH3mX6vKYzKjsKbpJpQztx_8", sheet = "lista_ksiazek")
Reading from 'ks_BN_2011_listy_pracownik昼㸳w'
Range "'lista_ksiazek'"
New names:
* link -> link...4
* link -> link...5
listy_2010 <- sheets_read(ss = "1Vjeg0JsYI-8v9B-x_yyujIhmw7UR7Lk7poexrHNdVzM", sheet = "lista_ksiazek")
Reading from 'ks_BN_2010_listy_pracownik昼㸳w'
Range "'lista_ksiazek'"
New names:
* `` -> ...4
listy_2009 <- sheets_read(ss = "1Gc4gQSm9b4NDTQysiauzW9Jac6yP0oNuFbB8utO4kS4", sheet = "lista_ksiazek")
Reading from 'ks_BN_2009_listy_pracownik昼㸳w'
Range "'lista_ksiazek'"
pojawi戼㸳y si攼㹡 warto㤼㹣ci NA na skutek przekszta戼㸳ceniaNew names:
* `` -> ...4
listy_2005 <- sheets_read(ss = "1HkWkX61sQWktSXf0v0uPV8j2DwuTocesyCJuKTdisIU", sheet = "lista_ksiazek")
Reading from 'ks_BN_2005_listy_pracownik昼㸳w'
Range "'lista_ksiazek'"
New names:
* link -> link...4
* link -> link...5
listy_2006 <- sheets_read(ss = "1zeMx_Idsum8JmlM6G7Eufx9LxloHoAHv8V-My71VZf4", sheet = "lista_ksiazek")
Reading from 'ks_BN_2006_listy_pracownik昼㸳w'
Range "'lista_ksiazek'"
New names:
* link -> link...4
* link -> link...5
listy_2007 <- sheets_read(ss = "19iL7YoD8ug-rLnpzS6FD46aS2J1BRf4qL5VxllywCGE", sheet = "lista_ksiazek")
Reading from 'ks_BN_2007_listy_pracownik昼㸳w'
Range "'lista_ksiazek'"
New names:
* link -> link...4
* link -> link...5
listy_2008 <- sheets_read(ss = "1RshTeWdXBE7OzOEfoGpL9Ljb_GXDlGDePNjV1HKmuOo", sheet = "lista_ksiazek")
Reading from 'ks_BN_2008_listy_pracownik昼㸳w'
Range "'lista_ksiazek'"
New names:
* link -> link...4
* link -> link...5
listy_2004 <- sheets_read(ss = "1RmDia97s4B8F74sS7Wbpnv_A9zMfr4xTvcD9leukAfM", sheet = "lista_książek") %>%
  mutate(typ_ksiazki = NA, link = NA, link_1 = NA, status = NA, blad_w_imporcie_tytulu = NA) %>%
  select(pracownik,ZA_ZAPIS_ID,typ_ksiazki, link, link_1, rok, status, blad_w_imporcie_tytulu, X100, X245, X650, X655, X246, X250, X260, X300, X380, X490, X500, X501, X546, X600, X700, X041, X080)
Reading from 'ks_BN_2004_listy_pracownik昼㸳w'
Range "'lista_ksi戼㸹戼㹦ek'"
New names:
* `` -> ...26
* `` -> ...27
* `` -> ...29
#ujednolicenie 2004 do wzoru późniejszych rocznikóW
do2004 <- RJDBC::dbGetQuery(PBL,
                            "select z.za_zapis_id, z.za_status_imp
                            from pbl_zapisy z
                            where z.za_uwagi like '%import%02%'")
listy_2004 <- merge(listy_2004,do2004,by = "ZA_ZAPIS_ID",all.x = TRUE) %>%
  mutate(status = ZA_STATUS_IMP) %>%
  select(-ZA_STATUS_IMP) %>%
  select(pracownik,ZA_ZAPIS_ID,typ_ksiazki, link, link_1, rok, status, blad_w_imporcie_tytulu, X100, X245, X650, X655, X246, X250, X260, X300, X380, X490, X500, X501, X546, X600, X700, X041, X080)
#zapewnienie tych samych nazw kolumn
#aktualizacja - wprowadź wiersz dla ostatniego zaimportowanego rocznika
colnames(listy_2011) <- names(listy_2004)
colnames(listy_2010) <- names(listy_2004)
colnames(listy_2009) <- names(listy_2004)
colnames(listy_2005) <- names(listy_2004)
colnames(listy_2006) <- names(listy_2004)
colnames(listy_2007) <- names(listy_2004)
colnames(listy_2008) <- names(listy_2004)
listy_2004 <- listy_2004 %>%
  mutate(X655 = str_remove(str_replace_all(X655,"(\\$a)","|\\1"),"^\\|"),
         X650 = str_remove(str_replace_all(X650,"(\\$a)","|\\1"),"^\\|"))

#wyznaczenie listy 650 i 655 do automatycznego INO na podstawie wcześniejszych importów - usunięte są tylko te deskryptory, które nie mają związku z literaturą podmiotową
zapisy <- RJDBC::dbGetQuery(PBL,
                            "select z.za_zapis_id, z.za_status_imp, z.za_uwagi, z.za_adnotacje
                            from pbl_zapisy z
                            where z.za_uwagi like '%import%'") %>%
  mutate(pracownik_pbl = str_extract(ZA_UWAGI, "(?<=akceptuje:)([A-Z]*)")) %>%
  select(ZA_ZAPIS_ID,pracownik_pbl,ZA_STATUS_IMP,ZA_ADNOTACJE)
#aktualizacja - dodaj do skryptu listę z ostatnim brakującym zaimportowanym rocznikiem
do_importu_NIE <- rbind(listy_2004,listy_2005,listy_2006,listy_2007,listy_2008, listy_2009, listy_2010, listy_2011) %>%
  full_join(.,zapisy,by = "ZA_ZAPIS_ID") %>%
  select(X650,X655,ZA_STATUS_IMP,ZA_ADNOTACJE) %>%
  mutate(X650 = str_remove_all(X650,"\\\\7"),
         X655 = str_remove_all(X655,"\\\\7"),
         joint = paste(X650,X655,sep = "~")) %>%
  select(ZA_STATUS_IMP,joint,ZA_ADNOTACJE) %>%
  group_by(joint) %>%
  mutate(grupa = paste(ZA_STATUS_IMP,collapse = ","),
         ZA_ADNOTACJE = paste(ZA_ADNOTACJE,collapse = ",")) %>%
  ungroup() %>%
  select(joint, grupa,ZA_ADNOTACJE) %>%
  unique() %>%
  filter(!grepl("rozpisana|rozpisać|rozpisania",ZA_ADNOTACJE)) %>% 
  mutate(ile = str_count(grupa,",")+1) %>%
  filter(grepl("INO",grupa)) %>%
  filter(!grepl("IOK|IMP|IPN|IPC",grupa)) %>%
  mutate(czy = str_detect(joint,"\\$y[\\d-]+ w\\.")) %>%
  filter(czy==FALSE) %>%
  select(joint) %>%
  mutate(joint = str_remove_all(str_replace_all(joint,"(\\$a)","\\\\#7\\1"),"#")) %>%
  mutate(do_wyrzucenia_na_podstawie_INO = "tak")

bn_ok <- bn_ok %>%
  mutate(X650 = ifelse(X650=="",NA,as.character(X650)),
         X655 = ifelse(X655=="",NA,as.character(X655)),
         joint = paste(X650,X655,sep = "~")) %>%
  left_join(.,do_importu_NIE,by = "joint") %>%
  mutate(X650 = ifelse(is.na(X650),"",as.character(X650)),
         X655 = ifelse(is.na(X655),"",as.character(X655)))

do_importu_NIE <- bn_ok %>%
  filter(is.na(osoba_bn_autor)&is.na(osoba_bn_temat)&is.na(slowa_literackie)&do_wyrzucenia_na_podstawie_INO=="tak") %>%
  filter(!grepl("literat|literac|pamiętnik|pisar",X655,ignore.case = TRUE))

bn_ok <- sqldf("select *
               from bn_ok a
               where a.id not in (select b.id from do_importu_NIE b)") %>%
  select(-joint,-do_wyrzucenia_na_podstawie_INO)

#usunięcie na podstawie tabel KP
out <- sheets_read(ss = "1lO_ZtwyBDePGqXkgWyk_WmGeQBaAQBvEUjNnctrw-vg") %>%
  filter(wchodzi_do_pbl == "nie")
Reading from 'X650 dla X655 Wydawnictwa popularne'
KP_out <- bn_ok %>%
  filter(grepl("Wydawnictwa popularne",X655)) %>%
  unique() %>%
  full_join(.,out,by = "X650") %>%
  filter(wchodzi_do_pbl=="nie") %>%
  filter(!is.na(X655)) %>%
  select(id)

bn_ok <- sqldf("select *
               from bn_ok a
               where a.id not in (select b.id from KP_out b)")

#czy próbować wyrzucać po UKD, które dostawało tylko INO?
#aktualizacja - dodaj do skryptu listę z ostatnim brakującym zaimportowanym rocznikiem
do_importu_NIE2 <- rbind(listy_2004,listy_2005,listy_2006,listy_2007,listy_2008, listy_2009, listy_2010, listy_2011) %>%
  full_join(.,zapisy,by = "ZA_ZAPIS_ID") %>%
  select(X080,ZA_STATUS_IMP) %>%
  mutate(X080 = str_remove_all(X080,"\\\\")) %>%
  select(ZA_STATUS_IMP,X080) %>%
  group_by(X080) %>%
  mutate(grupa = paste(ZA_STATUS_IMP,collapse = ",")) %>%
  ungroup() %>%
  select(X080, grupa) %>%
  unique() %>%
  mutate(ile = str_count(grupa,",")+1) %>%
  filter(grepl("INO",grupa)) %>%
  filter(!grepl("IOK|IMP|IPN|IPC",grupa)) %>%
#tu się musi KP wypowiedzieć, czy jak było 2xNIE to wystarczy, żeby wywalać
#  filter(ile > 1) %>%
  select(X080) %>%
  mutate(X080 = paste("\\",str_remove_all(str_replace_all(X080,"(\\$a)","\\\\#\\1"),"#"),sep = "")) %>%
  mutate(do_wyrzucenia_na_podstawie_INO = "tak")

#na podstawie UKD też wyrzucić - decyzja KP
bn_ok <- bn_ok %>%
  full_join(.,do_importu_NIE2,by = "X080") %>%
  filter(!is.na(id))

do_importu_NIE2 <- bn_ok %>%
  filter(is.na(osoba_bn_autor)&is.na(osoba_bn_temat)&is.na(slowa_literackie)&do_wyrzucenia_na_podstawie_INO=="tak")

bn_ok <- sqldf("select *
               from bn_ok a
               where a.id not in (select b.id from do_importu_NIE2 b)") %>%
  select(-do_wyrzucenia_na_podstawie_INO)

#reszta rekordów, które nie będą zaimportowane
reszta <- sqldf("select *
               from bn_ks a
               where a.id not in 
               (select b.id
               from bn_ok b)")
chunk4 <- bn_ok
bn_ok <- chunk4
stare_rodzajowanie <- bn_ok %>%
  mutate(czy_ma_ukd = ifelse(X080=="","nie","tak"),
         position_dash = ifelse(grepl("(\\\\\\\\\\$a|:)(821\\.)",X080),str_locate(X080,"\\-")[,1], NA),
         position_dash = ifelse(is.na(position_dash),"",as.integer(position_dash)),
         position_091 = str_locate(X080,"\\(091\\)")[,1],
         position_091 = ifelse(is.na(position_091),"",as.integer(position_091)),
         rodzaj_ksiazki = ifelse(grepl("Antologi",X655),"antologia",
                                 ifelse(position_091!=""&position_dash!="",
                          ifelse(as.integer(position_091)<as.integer(position_dash), "przedmiotowa", "podmiotowa"),
                          ifelse(position_dash!="","podmiotowa","przedmiotowa"))),
         rodzaj_ksiazki = ifelse(czy_ma_ukd=="nie","",as.character(rodzaj_ksiazki)))
gatunki_podmiotowe <- stare_rodzajowanie %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  select(X655) %>%
  unique() %>%
  cSplit(.,"X655",sep = "|",direction = "long") %>%
  unique() %>%
  filter(str_detect(X655,"\\$y[\\d-]+ w\\."))
gatunki_podmiotowe <- str_replace_all(str_replace_all(paste(gatunki_podmiotowe$X655,collapse = "|"),"(.{2})(\\$a)","\\2"),"\\$","\\\\$")
stare_rodzajowanie$czy_podmiotowy <- grepl(gatunki_podmiotowe,stare_rodzajowanie$X655)|grepl(gatunki_podmiotowe,stare_rodzajowanie$X650)
stare_rodzajowanie <- stare_rodzajowanie %>%
  mutate(rodzaj_ksiazki = ifelse(str_count(X245, " / ")+1>2,"antologia",
                                 ifelse(str_count(X245, " / ")+1==2,"współwydanie",
                                        ifelse(rodzaj_ksiazki==""&czy_podmiotowy==TRUE&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",
                                               ifelse(X100!=""&grepl("aPamiętnik|aLiteratura podróżnicza",X655)&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",
                                                      ifelse(X100!=""&grepl("aReportaż",X655)&grepl("\\$y",X655)&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",
                                                             ifelse(X100!=""&(X655=="\\7$aReportaż polski$2DBN"|X655=="\\7$aReportaż$2DBN")&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",
                                                                    ifelse(rodzaj_ksiazki==""&czy_podmiotowy==FALSE,"przedmiotowa",as.character(rodzaj_ksiazki)))))))),
         rodzaj_ksiazki = ifelse(rodzaj_ksiazki=="","przedmiotowa",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(grepl("Lektury Wszech Czasów : streszczenie, analiza, interpretacja|Lektury Wszech Czasów - Literat|Biblioteczka Opracowań",X490)|grepl("Lektury Wszech Czasów : streszczenie, analiza, interpretacja|Lektury Wszech Czasów - Literat|Biblioteczka Opracowań",X830),"przedmiotowa",as.character(rodzaj_ksiazki)),
         ilu_tworcow = str_count(X100,"\\$a"),
         rodzaj_ksiazki = ifelse(ilu_tworcow>4&rodzaj_ksiazki=="podmiotowa","antologia",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(grepl("Legendy",X655),"antologia",as.character(rodzaj_ksiazki))) %>%
  filter(grepl("katalog wystawy",X655,ignore.case = TRUE)&rodzaj_ksiazki=="przedmiotowa") %>% 
  select(id)

##właściwe rodzajowanie z uwaględnieniem jednego elementu ze starego rodzajowania
bn_ok <- bn_ok %>%
  mutate(czy_ma_ukd = ifelse(X080=="","nie","tak"),
         position_dash = ifelse(grepl("(\\\\\\\\\\$a|:)(821\\.)",X080),str_locate(str_replace(X080,"(.*?)(\\$a821\\.)(.*?$)","\\2\\3"),"\\-")[,1]+nchar(str_replace(X080,"(.*?)(\\$a821\\.)(.*?$)","\\1")), NA),
         position_dash = ifelse(is.na(position_dash),"",as.integer(position_dash)),
         position_091 = str_locate(X080,"\\(091\\)")[,1],
         position_091 = ifelse(is.na(position_091),"",as.integer(position_091)),
         rodzaj_ksiazki = ifelse(grepl("antologi|Przysłowia [\\S]+\\$2|Cytaty\\$2",X655,ignore.case = TRUE),"antologia",
                                 ifelse(position_091!=""&position_dash!="",
                          ifelse(as.integer(position_091)<as.integer(position_dash), "przedmiotowa", "podmiotowa"),
                          ifelse(position_dash!="","podmiotowa","przedmiotowa"))),
         rodzaj_ksiazki = ifelse(czy_ma_ukd=="nie","",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(grepl("82-93",X080)&rodzaj_ksiazki!="antologia","podmiotowa",as.character(rodzaj_ksiazki)))

rekordy_podmiotowe_stare <- dbGetQuery(PBL,
                                       "select z.za_zapis_id
                                        from pbl_zapisy z
                                        join IBL_OWNER.pbl_rodzaje_zapisow rz on rz.rz_rodzaj_id=z.za_rz_rodzaj1_id
                                        where rz.rz_rodzaj_id=1
                                        and z.za_uwagi like '%import%'")
#aktualizacja - dodaj do skryptu listę z ostatnim brakującym zaimportowanym rocznikiem
gatunki_poprzednie_imp <- rbind(listy_2004,listy_2005,listy_2006,listy_2007,listy_2008, listy_2009, listy_2010, listy_2011) %>% 
  filter(ZA_ZAPIS_ID %in% rekordy_podmiotowe_stare$ZA_ZAPIS_ID) %>% 
  mutate(X655 = ifelse(rok==2004,str_remove_all(str_replace_all(X655,"(\\$a)","\\\\#7\\1"),"#"),as.character(X655))) %>% 
  select(X655) %>% 
  unique()

gatunki_podmiotowe <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  select(X655) %>%
  bind_rows(.,gatunki_poprzednie_imp) %>% 
  unique() %>%
  cSplit(.,"X655",sep = "|",direction = "long") %>%
  unique() %>%
  filter(!grepl("xhistoria|xtematyka|xbiografia",X655)) %>% 
  filter(str_detect(X655,"\\$y[\\d-]+ w\\."), 
         grepl("( \\S+)(\\$y)(.*?$)", X655)) %>% 
  #mutate(X655 = str_replace(X655, "(?<= )(\\S+)(\\$y)(.*?$)", "[\\\\S]+\\2")) %>% 
  mutate(X655 = str_replace(X655, "(?<= )(\\S+)(\\$y)(.*?$)", ".+\\2")) %>% 
  unique()

gatunki_podmiotowe <- str_replace_all(str_replace_all(str_replace_all(paste(gatunki_podmiotowe$X655,collapse = "|"),"(.{2})(\\$a)","\\2"),"\\$","\\\\$"), "\\(", "\\\\\\(")
bn_ok$czy_podmiotowy <- grepl(gatunki_podmiotowe,bn_ok$X655)|grepl(gatunki_podmiotowe,bn_ok$X650)
bn_ok <- bn_ok %>%
  mutate(rodzaj_ksiazki = ifelse(str_count(X245, " \\/ ")+1>2,"antologia",
                                 ifelse(str_count(X245, " \\/ \\[{0,1}[A-ZAÁÀÂÃÄĂĀÅĄÆEÉÈÊËĚĒĖĘIÍÌÎÏĪĮIOÓÒÔÕÖŐØŒUÚÙÛÜŰŪůYÝCĆČçDĎĐĐGĢĞKĶLŁĻNŃÑŇŅŊRŘSŚŠŞSßTŤŦÞŢ8ZŻŹŽ]")+1==2,"współwydanie",
                                        ifelse(rodzaj_ksiazki==""&czy_podmiotowy==TRUE&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",
                                               ifelse(X100!=""&grepl("aPamiętnik|aLiteratura podróżnicza",X655)&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",
                                                      ifelse(X100!=""&grepl("aReportaż",X655)&grepl("\\$y",X655)&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",
                                                             ifelse(X100!=""&(X655=="\\7$aReportaż polski$2DBN"|X655=="\\7$aReportaż$2DBN")&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",
                                                                    ifelse(rodzaj_ksiazki==""&czy_podmiotowy==FALSE,"przedmiotowa",as.character(rodzaj_ksiazki)))))))),
         rodzaj_ksiazki = ifelse(rodzaj_ksiazki=="","przedmiotowa",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(grepl("Lektury Wszech Czasów \\: streszczenie, analiza, interpretacja|Lektury Wszech Czasów - Literat|Biblioteczka Opracowań",X490)|grepl("Lektury Wszech Czasów \\: streszczenie, analiza, interpretacja|Lektury Wszech Czasów - Literat|Biblioteczka Opracowań",X830),"przedmiotowa",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(grepl("aLektura z Opracowaniem - Zielona Sowa|aLektura \\(Greg\\)|aLektura Dobrze Opracowana|aLektura z Opracowaniem - Ibis",X830),"podmiotowa",as.character(rodzaj_ksiazki)),
         ilu_tworcow = str_count(X100,"\\$a"),
         rodzaj_ksiazki = ifelse(ilu_tworcow>4&rodzaj_ksiazki=="podmiotowa","antologia",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(grepl("Legendy|\\$vantologi",X655),"antologia",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(str_count(X100, "\\|")==0&X100!=""&rodzaj_ksiazki=="antologia"&grepl("Legendy i podania|Antologia",X655),"podmiotowa",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(X100==""&str_count(X700,"\\$t")==3&grepl("Harlequin",X260),"antologia",as.character(rodzaj_ksiazki))) %>%
  select(1:34,rodzaj_ksiazki)


# przypisania do podmiotowej na podstawie smierci przed 1700
marc_field_100 <- bn_ok %>%
  filter(!is.na(osoba_bn_autor)) %>%
  select(id,X100)%>%
  filter(!grepl("\\|", X100)) %>% 
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(bn_ok$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}

marc_field_100 <- marc_field_100 %>% 
  filter(!is.na(`$d`) & str_extract(`$d`, "\\d+(?!.*\\d+)") < 1700)

bn_ok <- bn_ok %>% 
  mutate(rodzaj_ksiazki = ifelse(id %in% marc_field_100$id, "podmiotowa", as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(id %in% stare_rodzajowanie$id, "przedmiotowa",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(X080=="\\\\$a82-1/-9(0.054)"&rodzaj_ksiazki=="przedmiotowa"&!grepl("xhistoria|xtematyka|xbiografia",X650)&!grepl("xhistoria|xtematyka|xbiografia",X655),"podmiotowa",as.character(rodzaj_ksiazki)),
         rodzaj_ksiazki = ifelse(rodzaj_ksiazki=="podmiotowa"&grepl("aut\\.",X245)&grepl("et al\\.",X245),"antologia",as.character(rodzaj_ksiazki)))
chunk5 <- bn_ok
bn_ok <- chunk5
IOK_podm <- bn_ok %>%
  filter(!grepl("\\$t",X700)) %>%
  mutate(ile_gatunkow = ifelse(rodzaj_ksiazki=="podmiotowa",str_count(X655,"\\$a"),"nie"),
         tylko_podmiotowe = ifelse(str_count(X655,"\\$a")>0&str_count(X655,"\\$a")==str_count(X655,"\\$y")&str_count(X655,"\\$y")!=str_count(X655,"\\$x"),"tak","nie")) %>%
  filter(str_count(X100,"\\$a")==1) %>%
  filter(!grepl("pseud|nazwa",X500,ignore.case = TRUE)&X501==""&(tylko_podmiotowe=="tak"|ile_gatunkow=="1")&X100!="")

#zestawienie 100 i 245
#100
marc_field_100 <- IOK_podm %>%
  select(id,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(IOK_podm$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
marc_field_100 <- marc_field_100 %>%
  select(id,`$a`) %>%
  mutate(bn_nazwisko = ifelse(str_detect(`$a`,","),str_replace(`$a`,"^(.*?)(, )(.*?$)","\\1"),as.character(`$a`)),
         bn_imie = ifelse(str_detect(`$a`,","),str_replace(`$a`,"^(.*?)(, )(.*?$)","\\3"),"")) %>%
  select(id,bn_nazwisko,bn_imie)

IOK_podm <- IOK_podm %>%
  full_join(.,marc_field_100,by = "id")

x <- 1:length(IOK_podm$id)
for (i in x) {
  
  IOK_podm$czy_nazwisko[i] <- grepl(IOK_podm$bn_nazwisko[i],IOK_podm$X245[i])
  IOK_podm$czy_imie[i] <- grepl(IOK_podm$bn_imie[i],IOK_podm$X245[i])
  
}
#usunięcie tych, które nie mają tytułów oryginalnych
IOK_podm <- IOK_podm %>%
  filter(czy_nazwisko==1&czy_imie==1&!grepl("et al\\.",X245)) %>%
  select(-bn_nazwisko,-bn_imie,-czy_nazwisko,-czy_imie) %>%
  unique() %>%
  mutate(jezyk = str_extract(X041,("(?<=\\$h)(...)"))) %>%
  mutate(czy_tytul_obcy = ifelse(is.na(jezyk),"nie dotyczy",
                                 ifelse(!grepl("pol",jezyk),
                                        ifelse(X246!="","ok",
                                               ifelse(grepl("Tyt[,\\.] oryg",X501)|grepl("Tyt[,\\.] oryg",X500),"ok","problem")),"nie dotyczy"))) %>%
  filter(czy_tytul_obcy!="problem") %>%
  select(id) %>%
  mutate(automatyczna_podmiotowa = "tak")
###tutaj kończą się automatyczne podmiotowe
bn_ok <- bn_ok %>%
  full_join(.,IOK_podm,by = "id") %>%
  mutate(czy_automatycznie = ifelse(!is.na(automatyczna_podmiotowa),"podmiotowa","nie")) %>%
  select(-automatyczna_podmiotowa) %>%
  mutate(czy_automatycznie = ifelse(czy_automatycznie=="podmiotowa"&rodzaj_ksiazki!="podmiotowa","nie",as.character(czy_automatycznie)))

###czy i jak automatyzować przedmiotową?

#write.csv2(bn_ok, "C:/Users/Cezary/Desktop/bn_ok_2009.csv", row.names = F, na = '', fileEncoding = 'UTF-8')
chunk6 <- bn_ok
bn_ok <- chunk6

#propozycja1
#na później kierowane są wszystkie książki przedmiotowe, które mają bez_ukd_PBL lub ukd_pogranicze i nie są biblią oraz książki wydane poza Polską, które nie poszły do automatycznego importu oraz harlequiny, które nie poszły do automatycznego importu
na_pozniej <- bn_ok %>%
  filter((if (X501=="") !grepl("pl",substr(X008,16,18))&!grepl("pol",substr(X008,36,38))&czy_automatycznie=="nie")|czy_automatycznie=="nie"&rodzaj_ksiazki=="przedmiotowa"&dziedzina_PBL %in% c("bez_ukd_PBL","ukd_pogranicze")&(czy_biblia!="tak"|is.na(czy_biblia))|grepl("arleq",X260,ignore.case = TRUE)&czy_automatycznie=="nie")
warunek posiada d戼㸳ugo㤼㹣攼㸶 > 1 i tylko pierwszy element b攼㹡dzie u戼㹦yty
#bezpiecznik

#propozycja2
#propozycja, by kierować na później wszystkie książki przedmiotowe z dziedziny "bez_ukd_PBL"
# na_pozniej <- bn_ok %>%
#   filter(czy_automatycznie=="nie"&rodzaj_ksiazki=="przedmiotowa"&dziedzina_PBL=="bez_ukd_PBL"&(czy_biblia!="tak"|is.na(czy_biblia)))

# #propozycja3
# na_pozniej <- bn_ok %>%
#   filter(czy_automatycznie=="nie"&rodzaj_ksiazki=="przedmiotowa"&dziedzina_PBL %in% c("bez_ukd_PBL","ukd_pogranicze")&(czy_biblia!="tak"|is.na(czy_biblia)))

#propozycja4
#stara operacja
# na_pozniej <- bn_ok %>%
#   filter(czy_automatycznie=="nie"&rodzaj_ksiazki=="przedmiotowa"&dziedzina_PBL=="bez_ukd_PBL") %>%
#   mutate(kategorie_literackie = ifelse(grepl("mitolog|baś|bajk|poezj|liryk|epik|dramat|literac|literat|pisar|wiersz|proz|powieś|opowiad|miniatur|aforyzm|esej|szkic|feliet|report|dzienni|wspomnie|autobiograf|kaza|rozmyśl|list|interpretacj",X650,ignore.case = TRUE)|grepl("mitolog|baś|bajk|poezj|liryk|epik|dramat|literac|literat|pisar|wiersz|proz|powieś|opowiad|miniatur|aforyzm|esej|szkic|feliet|report|dzienni|wspomnie|autobiograf|kaza|rozmyśl|list|interpretacj",X655, ignore.case = TRUE),"tak","nie")) %>%
#   filter(kategorie_literackie=="nie") %>%
#   mutate(lata = ifelse(grepl("\\d{2}-",X100),str_replace(X100,"(.*\\$d\\(.*?)(\\d{2,4})(\\?{0,1}-.*)","\\2"),NA),
#          lata_temat = ifelse(grepl("\\d{2}-",X600),str_replace(X600,"(.*\\$d\\(.*?)(\\d{2,4})(\\?{0,1}-.*)","\\2"),NA)) %>%
# filter((is.na(lata)&is.na(lata_temat))|!(as.integer(lata)<1800)|!(as.integer(lata_temat)<1800))
write.csv2(na_pozniej, paste("C:/Users/",employee_name,"/Desktop/bn_",import_year,"_ks_na_pozniej.csv",sep = ""), row.names = F, na = '', fileEncoding = 'UTF-8')

bn_ok <- sqldf("select *
               from bn_ok a
               where a.id not in (select b.id from na_pozniej b)")
chunk7 <- bn_ok

Czy jest sens to robić?

###automatycznie działowanie przedmiotowej na podstawie dotychczasowych importów
#zapisy <- RJDBC::dbGetQuery(PBL,
#                            "select z.za_zapis_id, dz.dz_dzial_id, dz.dz_nazwa, z.za_status_imp, z.za_uwagi
#                            from pbl_zapisy z
#                            join pbl_dzialy dz on dz.dz_dzial_id=z.za_dz_dzial1_id
#                            where z.za_uwagi like '%import%'") %>%
#  mutate(pracownik_pbl = str_extract(ZA_UWAGI, "(?<=akceptuje:)([A-Z]*)")) %>%
#  select(-ZA_UWAGI)
#
#poprzednie_importy <- rbind(listy_2004,listy_2005,listy_2006,listy_2007,listy_2008) %>%
#  full_join(.,zapisy,by = "ZA_ZAPIS_ID") %>%
#  select(X650,X655,DZ_DZIAL_ID,DZ_NAZWA,ZA_STATUS_IMP) %>%
#  mutate(X650 = str_remove_all(X650,"\\\\7"),
#         X655 = str_remove_all(X655,"\\\\7"),
#         X650 = str_remove_all(str_replace_all(X650,"(\\$a)","\\\\#7\\1"),"#"),
#         X655 = str_remove_all(str_replace_all(X655,"(\\$a)","\\\\#7\\1"),"#")) %>%
#  group_by_at(vars(X650:DZ_NAZWA)) %>%
#  mutate(ZA_STATUS_IMP = paste(ZA_STATUS_IMP,collapse = "|")) %>%
#  ungroup() %>%
#  unique() %>%
#  ungroup() %>%
#  filter(!grepl("\\|",DZ_DZIAL_ID)) %>%
#  filter(grepl("IOK",ZA_STATUS_IMP)) %>%
#  filter(!grepl("INO|IMP|IPN|IPC",ZA_STATUS_IMP)) %>%
#  filter(!grepl("osobowe",DZ_NAZWA)) %>%
#  filter(!(is.na(X650)&is.na(X655))) %>%
#  mutate(ile650 = str_count(X650,"\\|")+1,
#         ile655 = str_count(X655,"\\|")+1) %>%
#  filter(ile650<=10|ile655<=10) %>%
#  select(-ile650,-ile655) %>%
#  mutate(ile_statusow = str_count(ZA_STATUS_IMP,"\\|")+1) %>%
#  arrange(X655,X650,-ile_statusow)
#poprzednie_importy$id_grupy <- cumsum(!duplicated(poprzednie_importy[1:2]))
#poprzednie_importy <- poprzednie_importy[!duplicated(poprzednie_importy$id_grupy),] %>%
#  mutate(id = row_number()) %>%
#  select(-ile_statusow,-id_grupy)
#
#do_dzialowania <- data.frame(id = as.integer(), X650 = as.character(), X655 = as.character(), stringsAsFactors = FALSE)
#x <- 1:length(poprzednie_importy$id)
#for (i in x){
#  progress(match(i,x), max.value = length(x)) 
#    if (is.na(poprzednie_importy$X650[i])&!is.na(poprzednie_importy$X655[i])){
#      permutations <- as.data.frame(permutations(unlist(str_split(poprzednie_importy$X655[i],"\\|")), str_count(poprzednie_importy$X655[i],"\\|")+1)) %>%
#        unite(data=.,col = "permutation", sep = "|") %>%
#        mutate(X650 = NA,
#               X655 = permutation,
#               id = poprzednie_importy$id[i]) %>%
#        select(id,X650,X655)
#      do_dzialowania <- rbind(do_dzialowania,permutations)
#    } else if (is.na(poprzednie_importy$X655[i])&!is.na(poprzednie_importy$X650[i])){
#      permutations <- as.data.frame(permutations(unlist(str_split(poprzednie_importy$X650[i],"\\|")), str_count(poprzednie_importy$X650[i],"\\|")+1)) %>%
#        unite(data=.,col = "permutation", sep = "|") %>%
#        mutate(X650 = permutation,
#               X655 = NA,
#               id = poprzednie_importy$id[i]) %>%
#        select(id,X650,X655)
#      do_dzialowania <- rbind(do_dzialowania,permutations)
#    } else {
#      permutations <- as.data.frame(permutations(unlist(str_split(poprzednie_importy$X650[i],"\\|")), str_count(poprzednie_importy$X650[i],"\\|")+1)) %>%
#        unite(data=.,col = "permutation", sep = "|") %>%
#        mutate(X650 = permutation,
#               id = poprzednie_importy$id[i]) %>%
#        select(id,X650)
#      permutations650 <- data.frame(stringsAsFactors = FALSE)
#      permutations650 <- rbind(permutations650,permutations)
#      permutations <- as.data.frame(permutations(unlist(str_split(poprzednie_importy$X655[i],"\\|")), str_count(poprzednie_importy$X655[i],"\\|")+1)) %>%
#        unite(data=.,col = "permutation", sep = "|") %>%
#        mutate(X655 = permutation,
#               id = poprzednie_importy$id[i]) %>%
#        select(id,X655)
#      permutations655 <- data.frame(stringsAsFactors = FALSE)
#      permutations655 <- rbind(permutations655,permutations)
#      permutations <- merge(permutations650,permutations655,by = "id",all = TRUE) %>%
#        select(id,X650,X655)
#      do_dzialowania <- rbind(do_dzialowania,permutations)
#    }
#}
#
#do_dzialowania <- do_dzialowania %>%
#  full_join(.,poprzednie_importy %>% select(id,DZ_DZIAL_ID,DZ_NAZWA),by = "id") %>%
#  select(-id)
#do_dzialowania[is.na(do_dzialowania)] <- ""
#####tutaj sprawdzić
#do_dzialowania_przedm <- merge(bn_ok %>% filter(czy_automatycznie=="nie"&rodzaj_ksiazki=="przedmiotowa"),do_dzialowania, by = c("X650","X655")) %>%
#  select(id,DZ_DZIAL_ID,DZ_NAZWA)
#wczytanie kartotek PBL
redaktorzy_dzialow <- sheets_read(ss = "1Baje-ZfPgAKEDAoDzeo_eCBDrsL7jAXt6ubP2cedbFc", sheet = "redaktorzy_działów") %>%
  select(DZ_DZIAL_ID, DZ_NAZWA, redaktor_dzialu) #%>%
Reading from 'redaktorzy dzia戼㸳昼㸳w'
Range "'redaktorzy_dzia戼㸳昼㸳w'"
New names:
* `` -> ...14
  #mutate(DZ_DZIAL_ID = as.character(DZ_DZIAL_ID))

PBL_dzialy <- dbReadTable(PBL,'PBL_DZIALY') %>%
  select(1,3,6)

PBL_dzialy_path <- merge(x = PBL_dzialy, y = PBL_dzialy, by.x = "DZ_DZ_DZIAL_ID", by.y = "DZ_DZIAL_ID", all.x = TRUE)
colnames(PBL_dzialy_path) <- c("NAD_DZ_DZIAL_ID", "DZ_DZIAL_ID", "DZ_NAZWA", "NAD_DZ_NAZWA", "NAD_NAD_DZ_DZIAL_ID")

PBL_dzialy_path <- merge(x = PBL_dzialy_path, y = PBL_dzialy, by.x = "NAD_NAD_DZ_DZIAL_ID", by.y = "DZ_DZIAL_ID", all.x = TRUE)
colnames(PBL_dzialy_path) <- c("NAD_NAD_DZ_DZIAL_ID", "NAD_DZ_DZIAL_ID", "DZ_DZIAL_ID", "DZ_NAZWA", "NAD_DZ_NAZWA", "NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_DZ_DZIAL_ID")

PBL_dzialy_path <- merge(x = PBL_dzialy_path, y = PBL_dzialy, by.x = "NAD_NAD_NAD_DZ_DZIAL_ID", by.y = "DZ_DZIAL_ID", all.x = TRUE)
colnames(PBL_dzialy_path) <- c("NAD_NAD_NAD_DZ_DZIAL_ID", "NAD_NAD_DZ_DZIAL_ID", "NAD_DZ_DZIAL_ID", "DZ_DZIAL_ID", "DZ_NAZWA", "NAD_DZ_NAZWA", "NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_NAD_DZ_DZIAL_ID")

PBL_dzialy_path <- merge(x = PBL_dzialy_path, y = PBL_dzialy, by.x = "NAD_NAD_NAD_NAD_DZ_DZIAL_ID", by.y = "DZ_DZIAL_ID", all.x = TRUE)
colnames(PBL_dzialy_path) <- c("NAD_NAD_NAD_NAD_DZ_DZIAL_ID", "NAD_NAD_NAD_DZ_DZIAL_ID", "NAD_NAD_DZ_DZIAL_ID", "NAD_DZ_DZIAL_ID", "DZ_DZIAL_ID", "DZ_NAZWA", "NAD_DZ_NAZWA", "NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_NAD_NAD_DZ_DZIAL_ID")

PBL_dzialy_path <- merge(x = PBL_dzialy_path, y = PBL_dzialy, by.x = "NAD_NAD_NAD_NAD_NAD_DZ_DZIAL_ID", by.y = "DZ_DZIAL_ID", all.x = TRUE)
colnames(PBL_dzialy_path) <- c("NAD_NAD_NAD_NAD_NAD_DZ_DZIAL_ID", "NAD_NAD_NAD_NAD_DZ_DZIAL_ID", "NAD_NAD_NAD_DZ_DZIAL_ID", "NAD_NAD_DZ_DZIAL_ID", "NAD_DZ_DZIAL_ID", "DZ_DZIAL_ID", "DZ_NAZWA", "NAD_DZ_NAZWA", "NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_NAD_NAD_DZ_NAZWA", "NAD_NAD_NAD_NAD_NAD_NAD_DZ_DZIAL_ID")

PBL_dzialy_path <- PBL_dzialy_path %>%
  select(-length(PBL_dzialy_path)) %>%
  filter(DZ_DZIAL_ID!=0) %>%
  select(6,7,5,8,4,9,3,10,2,11,1,12) %>%
  unique()

PBL_dz_osob <- PBL_dzialy_path %>%
  filter(grepl("osobowe", DZ_NAZWA)|grepl("osobowe", NAD_DZ_NAZWA)|grepl("osobowe", NAD_NAD_DZ_NAZWA)|grepl("osobowe", NAD_NAD_NAD_DZ_NAZWA)|grepl("osobowe", NAD_NAD_NAD_NAD_DZ_NAZWA)|grepl("osobowe", NAD_NAD_NAD_NAD_NAD_DZ_NAZWA)) %>%
  select(1,2,3,4,5,6,7,8) %>%
  filter(DZ_DZIAL_ID!=148)

PBL_dz_osob_1 <- PBL_dz_osob %>%
  select(1,2,3,4)
PBL_dz_osob_2 <- PBL_dz_osob %>%
  select(1,2,5,6)
PBL_dz_osob_3 <- PBL_dz_osob %>%
  select(1,2,7,8)
colnames(PBL_dz_osob_2) <- c(names(PBL_dz_osob_1))
colnames(PBL_dz_osob_3) <- c(names(PBL_dz_osob_1))
PBL_dz_osob <- rbind(PBL_dz_osob_1,PBL_dz_osob_2,PBL_dz_osob_3) %>%
  filter(!is.na(NAD_DZ_DZIAL_ID)) %>%
  unique()
PBL_dz_osob <- rbind(PBL_dz_osob, c("15043", "Hasła osobowe(luksemburska)","15043", "Hasła osobowe(luksemburska)"), c("430", "Hasła osobowe (Ludzie teatru i filmu)","430", "Hasła osobowe (Ludzie teatru i filmu)"))
PBL_dz_osob_bez_teatru <- PBL_dz_osob %>%
  filter(DZ_DZIAL_ID!=430)

PBL_tworcy <- dbReadTable(PBL,'PBL_TWORCY')
tw_i_dz_podm <- merge(x=PBL_tworcy,y=PBL_dz_osob_bez_teatru, by.x = "TW_DZ_DZIAL_ID", by.y = "NAD_DZ_DZIAL_ID", all.x = TRUE) %>%
  arrange(TW_TWORCA_ID)

tw_i_dz_podm <- data.frame(tw_i_dz_podm, pol_osob = ifelse(tw_i_dz_podm$TW_DZ_DZIAL_ID == 148 & substr(tw_i_dz_podm$TW_NAZWISKO,1,1)==str_sub(tw_i_dz_podm$DZ_NAZWA,nchar(as.character(tw_i_dz_podm$DZ_NAZWA)),nchar(as.character(tw_i_dz_podm$DZ_NAZWA))),TRUE,FALSE), pol = ifelse(tw_i_dz_podm$TW_DZ_DZIAL_ID == 148, TRUE, FALSE)) %>%
  filter(pol_osob == TRUE | pol == FALSE)
PBL_tworcy_podm <- tw_i_dz_podm %>%
  select(TW_TWORCA_ID, TW_NAZWISKO, TW_IMIE, DZ_DZIAL_ID, DZ_NAZWA, TW_NAZW_WLASCIWE, TW_PSEUDONIMY, TW_DATA_URODZIN, TW_DATA_ZGONU, TW_ROCZNIKI_PBL, TW_SLOWA_KLUCZOWE, TW_UWAGI, TW_ROK_URODZIN, TW_ROK_ZGONU, TW_LICZBA_ZAPISOW, TW_ADNOTACJE, TW_TRANSLITERACJE) %>%
  filter(!is.na(DZ_DZIAL_ID))
colnames(PBL_tworcy_podm) <- c("TW_TWORCA_ID", "TW_NAZWISKO", "TW_IMIE", "TW_DZ_DZIAL_ID", "DZ_NAZWA", "TW_NAZW_WLASCIWE", "TW_PSEUDONIMY", "TW_DATA_URODZIN", "TW_DATA_ZGONU", "TW_ROCZNIKI_PBL", "TW_SLOWA_KLUCZOWE", "TW_UWAGI", "TW_ROK_URODZIN", "TW_ROK_ZGONU", "TW_LICZBA_ZAPISOW", "TW_ADNOTACJE", "TW_TRANSLITERACJE")
PBL_tworcy_podm <- PBL_tworcy_podm %>%
  mutate(nazwa = ifelse(is.na(TW_IMIE),as.character(TW_NAZWISKO),paste(TW_NAZWISKO,TW_IMIE, sep = "")),
         nazwa = str_to_lower(str_replace_all(nazwa, "\\W", "")),
         nazwa = str_replace_all(str_to_lower(nazwa), "\\W", ""))

tw_i_dz <- merge(x=PBL_tworcy,y=PBL_dz_osob, by.x = "TW_DZ_DZIAL_ID", by.y = "NAD_DZ_DZIAL_ID", all.x = TRUE) %>%
  arrange(TW_TWORCA_ID)
tw_i_dz <- data.frame(tw_i_dz, pol_osob = ifelse(tw_i_dz$TW_DZ_DZIAL_ID == 148 & substr(tw_i_dz$TW_NAZWISKO,1,1)==str_sub(tw_i_dz$DZ_NAZWA,nchar(as.character(tw_i_dz$DZ_NAZWA)),nchar(as.character(tw_i_dz$DZ_NAZWA))),TRUE,FALSE), pol = ifelse(tw_i_dz$TW_DZ_DZIAL_ID == 148, TRUE, FALSE)) %>%
  filter(pol_osob == TRUE | pol == FALSE)
PBL_tworcy <- tw_i_dz %>%
  select(TW_TWORCA_ID, TW_NAZWISKO, TW_IMIE, DZ_DZIAL_ID, DZ_NAZWA, TW_NAZW_WLASCIWE, TW_PSEUDONIMY, TW_DATA_URODZIN, TW_DATA_ZGONU, TW_ROCZNIKI_PBL, TW_SLOWA_KLUCZOWE, TW_UWAGI, TW_ROK_URODZIN, TW_ROK_ZGONU, TW_LICZBA_ZAPISOW, TW_ADNOTACJE, TW_TRANSLITERACJE)
colnames(PBL_tworcy) <- c("TW_TWORCA_ID", "TW_NAZWISKO", "TW_IMIE", "TW_DZ_DZIAL_ID", "DZ_NAZWA", "TW_NAZW_WLASCIWE", "TW_PSEUDONIMY", "TW_DATA_URODZIN", "TW_DATA_ZGONU", "TW_ROCZNIKI_PBL", "TW_SLOWA_KLUCZOWE", "TW_UWAGI", "TW_ROK_URODZIN", "TW_ROK_ZGONU", "TW_LICZBA_ZAPISOW", "TW_ADNOTACJE", "TW_TRANSLITERACJE")
PBL_tworcy <- PBL_tworcy %>%
  mutate(nazwa = ifelse(is.na(TW_IMIE),as.character(TW_NAZWISKO),paste(TW_NAZWISKO,TW_IMIE, sep = "")),
         nazwa = str_to_lower(str_replace_all(nazwa, "\\W", "")),
         nazwa = str_replace_all(str_to_lower(nazwa), "\\W", ""),
         TW_DZ_DZIAL_ID = as.numeric(TW_DZ_DZIAL_ID))

PBL_autorzy <- dbReadTable(PBL,'PBL_AUTORZY') %>%
  mutate(nazwa = ifelse(is.na(AM_IMIE),as.character(AM_NAZWISKO),paste(AM_NAZWISKO,AM_IMIE, sep = "")),
         nazwa = str_to_lower(str_replace_all(nazwa, "\\W", "")),
         nazwa = str_replace_all(str_to_lower(nazwa), "\\W", "")) %>%
  filter(nazwa != "nana")

PBL_wspoltworcy <- dbReadTable(PBL,'PBL_OSOBY') %>%
  mutate(nazwa_prosta = str_replace_all(str_to_lower(ifelse(is.na(OS_IMIE),as.character(OS_NAZWISKO),paste(OS_NAZWISKO,OS_IMIE, sep = ""))), "\\W", "")) %>%
  filter(nazwa_prosta !="nana")

PBL_funkcje <- sheets_read(ss = "1htn_L6REs3GdG1xSiGHIfr6MJvjmmU_kVGxiMZtCV24", sheet = "Arkusz1")
Reading from 'import_pbl_funkcje'
Range "'Arkusz1'"
PBL_wydawnictwa <- dbReadTable(PBL,'PBL_WYDAWNICTWA') %>%
  mutate(nazwa_prosta = str_replace_all(str_to_lower(paste(WY_MIASTO, WY_NAZWA)), "\\W", "")) %>%
  filter(nazwa_prosta !="nana")

PBL_rodzaje_zapisow <- dbReadTable(PBL,'PBL_RODZAJE_ZAPISOW')

BN_PBL_lista_literatur <- sheets_read(ss = "1zbwjnrtWGvbjrQTLMavJcWSu7HfP0I-USNgZ_KWiXjc", sheet = "lista ukd bn") %>%
  filter(!is.na(ukd_ogolne)) %>%
  select(3:9) %>%
  cSplit(.,c("pbl_id","pbl_nazwa","redaktor_dzialu","pbl_id_literatury","pbl_literatura"),sep = "|",direction = "long") %>%
  filter(!is.na(pbl_id))
Reading from 'lista_UKD_literatury'
Range "'lista ukd bn'"
PBL_hasla_osobowe <- sheets_read(ss = "1zbwjnrtWGvbjrQTLMavJcWSu7HfP0I-USNgZ_KWiXjc", sheet = "pbl_hasla_osobowe") %>%
  select(2:5)
Reading from 'lista_UKD_literatury'
Range "'pbl_hasla_osobowe'"
New names:
* nazwa -> nazwa...1
* nazwa -> nazwa...5
colnames(PBL_hasla_osobowe) <- c("DZ_DZIAL_ID","DZ_NAZWA","redaktor_dzialu","nazwa")
bn_ok <- chunk7
# podzielenie unikatowych rekordów bn na dwa wiersze w tabeli, z których powstaną dwa rekordy pbl
bn_ok <- bn_ok %>%
  mutate(ZA_UWAGI = 1:nrow(.))

wspolwydania_fix <- bn_ok %>%
  filter(rodzaj_ksiazki=="współwydanie") %>%
  mutate(X245 = ifelse(grepl("\\]\\.[^$]",X245),str_replace(X245,"(\\$c)(.*)(\\]\\. )(.* \\/ .*)","\\1\\2]|10$a\\4"),str_replace(X245,"(\\$c)(.*?)(?<!tł|red)(\\. )(.* \\/ .*)","\\1\\2|10$a\\4")),
         X245 = str_replace_all(X245, "\\/[^\\$]", "/$c"))

# usunięcie ze zbioru współwydawnictw (będą później połączone)
bn_ok <- bn_ok %>% 
  filter(id %notin% wspolwydania_fix$id)

# usunięcie z pola X246 wersji tytułów, które nie są tytułami oryginału
marc_field_246 <- wspolwydania_fix %>%
  select(ZA_UWAGI,X246)%>%
  mutate(X246=str_replace_all(X246,"(^|\\|)","~\\1"),
         X246 = ifelse(X246=="~",as.character(X246),str_remove(X246,"^~"))) %>%
  cSplit(.,"X246",sep = "~",direction = "long") %>%
  mutate(X246=str_remove_all(X246,"^\\|")) %>%
  mutate(indicator = str_replace_all(X246,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(wspolwydania_fix$X246,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_246)[1]))
colnames(empty_table) <-subfield_list
marc_field_246<-cbind(marc_field_246,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_246$X246 <- str_replace(marc_field_246$X246,subfield_list_char[i],"|\\1")
}
Progress: 1 on 2  Progress: 2 on 2  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_246[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_246$X246),str_replace_all(gsub(string,"\\3",marc_field_246$X246),"\\${2}.", "~"),NA)
}
Progress: 1 on 2  Progress: 2 on 2  
marc_field_246 <- marc_field_246[, colSums(is.na(marc_field_246)) != nrow(marc_field_246)]
marc_field_246 <- marc_field_246 %>% 
  filter(is.na(`$i`)|`$i`!="Tyt. przekł.:") %>% 
  select(ZA_UWAGI,X246) %>% 
  mutate(X246 = str_remove_all(X246,"\\|")) %>% 
  group_by(ZA_UWAGI) %>% 
  mutate(X246 = paste(X246,collapse = "|")) %>% 
  ungroup() %>% 
  unique()

wspolwydania_fix$X246 <- marc_field_246$X246

# podział na dwa rekordy
wspolwydania_fix <- wspolwydania_fix %>%
  cSplit(c("X245", "X246"), sep = "|", direction = "long") %>% 
  filter(!is.na(X245))

# zmiana pola ZA_UWAGI na wartość unikatową
wspolwydania_fix %$%  
    { ZA_UWAGI==lag(ZA_UWAGI,)} %>% 
    as.numeric() %>% 
    {.} -> wspolwydania_fix$same
wspolwydania_fix$same[1] <- 0
wspolwydania_fix <- wspolwydania_fix %>% 
  mutate(ZA_UWAGI = ifelse(same == 0, paste(rok,sprintf("%05d", as.integer(ZA_UWAGI)), "0", sep = ""), paste(rok,sprintf("%05d", as.integer(ZA_UWAGI)), "1", sep = ""))) %>% 
  select(-same)

# połączenie zbiorów
bn_ok <- bn_ok %>% 
  mutate(ZA_UWAGI = paste(rok,sprintf("%05d", as.integer(ZA_UWAGI)),sep = "")) %>% 
  bind_rows(wspolwydania_fix)
binding character and factor vector, coercing into character vectorbinding character and factor vector, coercing into character vector
chunk10 <- bn_ok
bn_ok <- chunk10
przedmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa")
###przypisanie redaktora na podstawie osoby z 600 jako tematu - książki o twórcy
#600
marc_field_600 <- przedmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X600)%>%
  filter(X600!="") %>%
  mutate(X600=str_replace_all(X600,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X600",sep = "~",direction = "long") %>%
  filter(X600!="") %>%
  mutate(X600=str_remove_all(X600,"^\\|")) %>%
  mutate(indicator = str_replace_all(X600,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(przedmiotowa_redaktorzy$X600,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_600)[1]))
colnames(empty_table) <-subfield_list
marc_field_600<-cbind(marc_field_600,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_600$X600 <- str_replace(marc_field_600$X600,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_600[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_600$X600),str_replace_all(gsub(string,"\\3",marc_field_600$X600),"\\${2}.", "~"),NA)
}
marc_field_600 <- marc_field_600 %>%
  select(ZA_UWAGI,`$a`,`$d`,`$c`) %>%
  mutate(name = ifelse(!is.na(`$c`)&substr(`$c`,nchar(`$c`),nchar(`$c`))==";",paste(`$a`,`$c`,`$d`,sep = " "),ifelse(!is.na(`$d`),paste(`$a`,`$d`,sep = " "),as.character(`$a`)))) %>%
  select(ZA_UWAGI,name) %>%
  mutate(name = str_replace(name,"(\\))(\\.$)","\\1"),
         name = str_replace(name, "([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)","\\1"))

marc_field_600 <- marc_field_600 %>%
  unique() %>%
  inner_join(.,pbl_viaf,by = c("name" = "BN_name")) %>%
  left_join(.,PBL_tworcy,by = c("pbl_id"="TW_TWORCA_ID")) %>%
  left_join(.,redaktorzy_dzialow,by = c("TW_DZ_DZIAL_ID"="DZ_DZIAL_ID")) %>%
  select(ZA_UWAGI,TW_TWORCA_ID=pbl_id,TW_NAZWISKO,TW_IMIE,TW_DZ_DZIAL_ID,DZ_NAZWA=DZ_NAZWA.x,redaktor_dzialu)
count <- as.data.frame(table(marc_field_600$ZA_UWAGI))
marc_field_600 <- merge(marc_field_600,count,by.x = "ZA_UWAGI", by.y = "Var1") %>%
  filter(Freq<2) %>%
  select(-Freq) %>%
  rename(DZ_DZIAL_ID=TW_DZ_DZIAL_ID) %>%
  mutate(RZ_RODZAJ_ID = 2,
         RZ_NAZWA = "książka o twórcy (przedmiotowa)")

###przypisanie do redaktorów na podstawie literatury z pola 655
przedmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa") %>%
  filter(ZA_UWAGI %notin% marc_field_600$ZA_UWAGI)

#655
marc_field_655 <- przedmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X655)%>%
  filter(X655!="") %>%
  mutate(X655=str_replace_all(X655,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X655",sep = "~",direction = "long") %>%
  filter(X655!="") %>%
  mutate(X655=str_remove_all(X655,"^\\|")) %>%
  mutate(indicator = str_replace_all(X655,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(przedmiotowa_redaktorzy$X655,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_655)[1]))
colnames(empty_table) <-subfield_list
marc_field_655<-cbind(marc_field_655,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_655$X655 <- str_replace(marc_field_655$X655,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_655[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_655$X655),str_replace_all(gsub(string,"\\3",marc_field_655$X655),"\\${2}.", "~"),NA)
}

marc_field_655 <- marc_field_655 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique()

PBL_literatury_obce <- PBL_dzialy_path %>%
  filter(NAD_DZ_DZIAL_ID==30) %>%
  select(1,2) %>%
  left_join(.,redaktorzy_dzialow,by = "DZ_DZIAL_ID") %>%
  filter(!is.na(redaktor_dzialu)) %>%
  select(1,DZ_NAZWA = 2,4) %>%
  mutate(nazwa = substr(str_replace(DZ_NAZWA, "(.*?)( )(.*?)","\\3"),1,nchar(str_replace(DZ_NAZWA, "(.*?)( )(.*?)","\\3"))-1),
         nazwa = ifelse(nazwa=="romska (cygańska","romsk|cygańsk",as.character(nazwa)))

reczne <- data.frame(DZ_DZIAL_ID = c(32,32,32,32,59,86,107,149,67,69,34,34,34,34,34,55,32,99,34),DZ_NAZWA = c("Literatura brytyjska i irlandzka","Literatura brytyjska i irlandzka","Literatura brytyjska i irlandzka","Literatura brytyjska i irlandzka","Literatura grecka starożytna","Literatura łacińska średniowieczna","Literatura syryjska","Literatura esperanto","Literatura holenderska","Literatury Indii","Literatury Afryki Subsaharyjskiej","Literatury Afryki Subsaharyjskiej","Literatury Afryki Subsaharyjskiej","Literatury Afryki Subsaharyjskiej","Literatury Afryki Subsaharyjskiej", "Literatura egipsko-arabska", "Literatura brytyjska i irlandzka","Literatura palestyńsko-arabska","Literatury Afryki Subsaharyjskiej"), redaktor_dzialu = c("BEATAK","BEATAK","BEATAK","BEATAK","BEATAS","BEATAS","BEATAD","CEZARY","TOMASZU","EWA","EWA","EWA","EWA","EWA","EWA","BEATAD","BEATAK","BEATAD","EWA"), nazwa = c("angielsk","szkock","irlandzk","walijsk","greck","łacińsk","syryjsk","esperanck","niderlandzk","indyjsk","południowoafryka","senegalsk","nigeryjsk","afrykańsk","ruandyjsk","egipsk. nowożytn","celtyck","palestyńsk","somalijsk"))

PBL_literatury_obce <- rbind(PBL_literatury_obce,reczne)

marc_field_655 <- sqldf("select *
                            from marc_field_655 a
                            left join PBL_literatury_obce b on a.`$a` like ('%'||b.nazwa||'%')") %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)

marc_field_655$same <- cumsum(!duplicated(marc_field_655[1]))
marc_field_655 <- marc_field_655[!duplicated(marc_field_655$same),] %>%
  select(ZA_UWAGI,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(marc_field_600))
###przypisanie do redaktorów na podstawie literatury z pola 650
przedmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa") %>%
  filter(ZA_UWAGI %notin% marc_field_600$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% marc_field_655$ZA_UWAGI)

#650
marc_field_650 <- przedmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X650)%>%
  filter(X650!="") %>%
  mutate(X650=str_replace_all(X650,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X650",sep = "~",direction = "long") %>%
  filter(X650!="") %>%
  mutate(X650=str_remove_all(X650,"^\\|")) %>%
  mutate(indicator = str_replace_all(X650,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(przedmiotowa_redaktorzy$X650,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_650)[1]))
colnames(empty_table) <-subfield_list
marc_field_650<-cbind(marc_field_650,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_650$X650 <- str_replace(marc_field_650$X650,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_650[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_650$X650),str_replace_all(gsub(string,"\\3",marc_field_650$X650),"\\${2}.", "~"),NA)
}

marc_field_650 <- marc_field_650 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique()

marc_field_650 <- sqldf("select *
                            from marc_field_650 a
                            left join PBL_literatury_obce b on a.`$a` like ('%'||b.nazwa||'%')") %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)

marc_field_650$same <- cumsum(!duplicated(marc_field_650[1]))
marc_field_650 <- marc_field_650[!duplicated(marc_field_650$same),] %>%
  select(ZA_UWAGI,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(marc_field_600))

do_przedmiotowej1 <- rbind(marc_field_600,marc_field_655,marc_field_650)

#przypisanie na podstawie deskryptorów tematycznych z 650 i 655
zapisy <- RJDBC::dbGetQuery(PBL,
                            "select z.za_zapis_id, dz.dz_dzial_id, dz.dz_nazwa, rz.rz_rodzaj_id, rz.rz_nazwa, z.za_status_imp, z.za_uwagi
                            from pbl_zapisy z
                            join pbl_dzialy dz on dz.dz_dzial_id=z.za_dz_dzial1_id
                            join pbl_rodzaje_zapisow rz on rz.rz_rodzaj_id=z.za_rz_rodzaj1_id
                            where z.za_uwagi like '%import%'") %>%
  mutate(pracownik_pbl = str_extract(ZA_UWAGI, "(?<=akceptuje:)([A-Z]*)")) %>%
  select(-ZA_UWAGI)
nazwy_lit_obcych <- str_replace_all(paste(PBL_literatury_obce$nazwa,collapse = "|"),"\\(","\\\\(")
#aktualizacja - dodaj do skryptu listę z ostatnim brakującym zaimportowanym rocznikiem
poprzednie_importy <- rbind(listy_2004,listy_2005,listy_2006,listy_2007,listy_2008, listy_2009, listy_2010, listy_2011) %>%
  full_join(.,zapisy,by = "ZA_ZAPIS_ID") %>%
  select(ZA_ZAPIS_ID,X650,X655,DZ_DZIAL_ID,DZ_NAZWA,RZ_RODZAJ_ID,RZ_NAZWA,pracownik_pbl,ZA_STATUS_IMP) %>%
  mutate(X650 = str_remove_all(X650,"\\\\7"),
         X655 = str_remove_all(X655,"\\\\7"),
         X650 = str_remove_all(str_replace_all(X650,"(\\$a)","\\\\#7\\1"),"#"),
         X655 = str_remove_all(str_replace_all(X655,"(\\$a)","\\\\#7\\1"),"#")) %>%
  unique() %>%
  filter(RZ_RODZAJ_ID %notin% c(0,1,2,250,764)) %>%
  arrange(pracownik_pbl,DZ_DZIAL_ID) %>%
  filter(!grepl(nazwy_lit_obcych,X650)&!grepl(nazwy_lit_obcych,X655)) %>%
  filter(!is.na(pracownik_pbl)) %>%
  filter(ZA_STATUS_IMP %in% c("IOK","IPC"))

#przypisanie na podstawie częstotliwości deskryptorów 655
przedmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa") %>%
  filter(ZA_UWAGI %notin% do_przedmiotowej1$ZA_UWAGI)

deskryptory655 <- poprzednie_importy %>%
  select(X655,pracownik_pbl,DZ_DZIAL_ID,DZ_NAZWA) %>%
  filter(!is.na(X655)) %>%
  unite(data=.,col = "deskryptor655", sep = "~")

deskryptory655 <- as.data.frame(table(deskryptory655$deskryptor655)) %>%
  cSplit(.,"Var1",sep = "~",direction = "wide") %>%
  rename(X655 = Var1_1,
         redaktor_dzialu = Var1_2,
         DZ_DZIAL_ID = Var1_3,
         DZ_NAZWA = Var1_4) %>%
  mutate(X655 = str_remove_all(X655,"\\\\7\\$a"),
         X655 = str_remove_all(X655,"\\$2DBN"),
         X655 = str_replace_all(X655,"\\$.|\\|"," "),
         X655 = str_replace_all(X655," ",".*"),
         X655 = str_replace_all(X655, "[^\\p{L}\\d\\*\\.\\-\\s]", "")) %>%
  arrange(X655,-Freq,DZ_NAZWA)

deskryptory655$id_grupy <- cumsum(!duplicated(deskryptory655[2]))
deskryptory655 <- deskryptory655[!duplicated(deskryptory655$id_grupy),] %>%
  select(-id_grupy) %>%
  arrange(-Freq)

x <- 1:length(deskryptory655$X655)
test <- data.frame(stringsAsFactors = FALSE)

for (i in x) {
  progress(match(i,x), max.value = length(x))
    do_przedmiotowej2 <- przedmiotowa_redaktorzy %>%
      mutate(redaktor_dzialu = ifelse(grepl(deskryptory655$X655[i],X655),as.character(deskryptory655$redaktor_dzialu)[i],NA),
             ile = ifelse(grepl(deskryptory655$X655[i],X655),as.integer(deskryptory655$Freq)[i],NA),
             co = ifelse(grepl(deskryptory655$X655[i],X655),as.character(deskryptory655$X655)[i],NA),
             DZ_DZIAL_ID = ifelse(grepl(deskryptory655$X655[i],X655),as.integer(deskryptory655$DZ_DZIAL_ID)[i],NA),
             DZ_NAZWA = ifelse(grepl(deskryptory655$X655[i],X655),as.character(deskryptory655$DZ_NAZWA)[i],NA)) %>%
      filter(!is.na(redaktor_dzialu))
    if (length(do_przedmiotowej2$redaktor_dzialu)>0) {
      test <- rbind(test,do_przedmiotowej2)
    } else {}
    
}
count <- as.data.frame(table(test$ZA_UWAGI))
do_przedmiotowej2 <- merge(test,count, by.x = "ZA_UWAGI",by.y = "Var1") %>%
  mutate(dlugosc = nchar(co)) %>%
  arrange(-Freq,ZA_UWAGI,-dlugosc,-ile)

do_przedmiotowej2$id_grupy <- cumsum(!duplicated(do_przedmiotowej2[1]))
do_przedmiotowej2 <- do_przedmiotowej2[!duplicated(do_przedmiotowej2$id_grupy),] %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(do_przedmiotowej1))
#przypisanie na podstawie częstotliwości deskryptorów 650
przedmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa") %>%
  filter(ZA_UWAGI %notin% do_przedmiotowej1$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_przedmiotowej2$ZA_UWAGI)

deskryptory650 <- poprzednie_importy %>%
  select(X650,pracownik_pbl,DZ_DZIAL_ID,DZ_NAZWA) %>%
  filter(!is.na(X650)) %>%
  unite(data=.,col = "deskryptor650", sep = "~")

deskryptory650 <- as.data.frame(table(deskryptory650$deskryptor650)) %>%
  cSplit(.,"Var1",sep = "~",direction = "wide") %>%
  rename(X650 = Var1_1,
         redaktor_dzialu = Var1_2,
         DZ_DZIAL_ID = Var1_3,
         DZ_NAZWA = Var1_4) %>%
  mutate(X650 = str_remove_all(X650,"\\\\7\\$a"),
         X650 = str_remove_all(X650,"\\$2DBN"),
         X650 = str_remove_all(X650,"\\\\\\\\"),
         X650 = str_replace_all(X650,"\\$.|\\|"," "),
         X650 = str_replace_all(X650," ",".*"),
         X650 = str_replace_all(X650, "[^\\p{L}\\d\\*\\.\\-\\s]", "")) %>%
  arrange(X650,-Freq,DZ_NAZWA)

deskryptory650$id_grupy <- cumsum(!duplicated(deskryptory650[2]))
deskryptory650 <- deskryptory650[!duplicated(deskryptory650$id_grupy),] %>%
  select(-id_grupy) %>%
  arrange(-Freq)

x <- 1:length(deskryptory650$X650)
test <- data.frame(stringsAsFactors = FALSE)
for (i in x) {
  progress(match(i,x), max.value = length(x))
    do_przedmiotowej3 <- przedmiotowa_redaktorzy %>%
      mutate(redaktor_dzialu = ifelse(grepl(deskryptory650$X650[i],X650),as.character(deskryptory650$redaktor_dzialu)[i],NA),
             ile = ifelse(grepl(deskryptory650$X650[i],X650),as.integer(deskryptory650$Freq)[i],NA),
             co = ifelse(grepl(deskryptory650$X650[i],X650),as.character(deskryptory650$X650)[i],NA),
             DZ_DZIAL_ID = ifelse(grepl(deskryptory650$X650[i],X650),as.integer(deskryptory650$DZ_DZIAL_ID)[i],NA),
             DZ_NAZWA = ifelse(grepl(deskryptory650$X650[i],X650),as.character(deskryptory650$DZ_NAZWA)[i],NA)) %>%
      filter(!is.na(redaktor_dzialu))
    if (length(do_przedmiotowej3$redaktor_dzialu)>0) {
      test <- rbind(test,do_przedmiotowej3)
    } else {}
    
}
count <- as.data.frame(table(test$ZA_UWAGI))
do_przedmiotowej3 <- merge(test,count, by.x = "ZA_UWAGI",by.y = "Var1") %>%
  mutate(dlugosc = nchar(co)) %>%
  arrange(-Freq,ZA_UWAGI,-dlugosc,-ile)

do_przedmiotowej3$id_grupy <- cumsum(!duplicated(do_przedmiotowej3[1]))
do_przedmiotowej3 <- do_przedmiotowej3[!duplicated(do_przedmiotowej3$id_grupy),] %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(do_przedmiotowej1))

do_przedmiotowej <- rbind(do_przedmiotowej1,do_przedmiotowej2,do_przedmiotowej3)
#przypisanie przedmiotowej na podstawie słownika pojęć
do_przedmiotowej <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa") %>%
  left_join(.,do_przedmiotowej,by="ZA_UWAGI") %>%
#przypisanie na podstawie zdefiniowanych słów (dopisanie do gotowego pliku)
  mutate(redaktor_dzialu = ifelse(is.na(redaktor_dzialu),
                                  ifelse(grepl("teatr",X655,ignore.case = TRUE)|grepl("teatr",X650,ignore.case = TRUE),"MARTAK",
                                         ifelse(grepl("film",X655,ignore.case = TRUE)|grepl("film",X650,ignore.case = TRUE),"OLA",
                                                    ifelse(grepl("telewizj",X655,ignore.case = TRUE)|grepl("telewizj",X650,ignore.case = TRUE),"EWA",
                                                           ifelse(grepl("radio",X655,ignore.case = TRUE)|grepl("radio",X650,ignore.case = TRUE),"EWA",
                                                                  ifelse(grepl("czasopism",X655,ignore.case = TRUE)|grepl("czasopism",X650,ignore.case = TRUE),"TOMASZ",
                                                                         ifelse(grepl("wydawnictw",X655,ignore.case = TRUE)|grepl("wydawnictw",X650,ignore.case = TRUE),"BARBARAW",
                                                                                ifelse(grepl("od 1989",X655,ignore.case = TRUE)|grepl("od 1989",X650,ignore.case = TRUE),"PAULINA",
                                                                                       ifelse(grepl("ćwicze|zadan|szkoł|szkół|scenariusz zajęć|scenariusze zajęć|zajęć|pomocnicz|podręcznik",X655,ignore.case = TRUE)|grepl("ćwicze|zadan|szkoł|szkół|scenariusz zajęć|scenariusze zajęć|zajęć|pomocnicz|podręcznik",X650,ignore.case = TRUE),"KAROLINA",
                                                                                              ifelse(grepl("sceniczn",X655,ignore.case = TRUE)|grepl("sceniczn",X650,ignore.case = TRUE),"MARTAK",
                                                                                                     ifelse(grepl("teoria|socjologia|antropologia|metafizyk|interpretac|filozof",X655,ignore.case = TRUE)|grepl("teoria|socjologia|antropologia|metafizyk|interpretac|filozof",X650,ignore.case = TRUE),"PAULINA",
                                                                                                            ifelse(grepl("ludow|zwycz|obycz|folkl",X655,ignore.case = TRUE)|grepl("ludow|zwycz|obycz|folkl",X650,ignore.case = TRUE),"ANIA",
                                                                                                                   ifelse(grepl("katolic|biblia|biblij|kościół",X655,ignore.case = TRUE)|grepl("katolic|biblia|biblij|kościół",X650,ignore.case = TRUE),"BEATAS",
                                                                                                                          ifelse(grepl("druk|rękopi|inkunab|inwent|bibliogr|słownik|bibliotek",X655,ignore.case = TRUE)|grepl("druk|rękopi|inkunab|inwent|bibliogr|słownik|bibliotek",X650,ignore.case = TRUE),"IZA",
                                                                                                                                 ifelse(grepl("zabawk|dziec",X655,ignore.case = TRUE)|grepl("zabawk|dziec",X650,ignore.case = TRUE),"BARBARAW",
                                                                                                                                        ifelse(grepl("tematyka|20-21 w.|21 w.",X655,ignore.case = TRUE)|grepl("tematyka|20-21 w.|21 w.",X650,ignore.case = TRUE),"PAULINA",
                                                                                                                                               ifelse(grepl("19|18|17|16|15|14|13",X655,ignore.case = TRUE)|grepl("19|18|17|16|15|14|13",X650,ignore.case = TRUE),"GOSIA",
                                                                                                                                                      ifelse(grepl("polityk",X655,X655,ignore.case = TRUE)|grepl("polityk",X650,X655,ignore.case = TRUE),"PAULINA",
                                                                                                                                                             ifelse(grepl("historia",X655,X655,ignore.case = TRUE)|grepl("historia",X650,X655,ignore.case = TRUE),"GOSIA",NA)))))))))))))))))),as.character(redaktor_dzialu)),
         RZ_RODZAJ_ID = ifelse(is.na(RZ_RODZAJ_ID),21,as.integer(RZ_RODZAJ_ID)),
         RZ_NAZWA = ifelse(is.na(RZ_NAZWA),"książka w haśle rzeczowym",as.character(RZ_NAZWA))) %>%
  select(names(do_przedmiotowej1)) %>%
  filter(!is.na(redaktor_dzialu))
#wydobycie zbioru, który ciągle nie ma przypisanych redaktorów do przedmiotowej
przedmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa") %>%
  filter(ZA_UWAGI %notin% do_przedmiotowej$ZA_UWAGI)
#dla książek, które mają kilku autorów w osoba_bn_temat - przypisanie do redaktora powszechnej - BEATAD?
do_przedmiotowej4 <- przedmiotowa_redaktorzy %>%
  filter(!is.na(osoba_bn_temat)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         DZ_DZIAL_ID = NA,
         DZ_NAZWA = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym",
         redaktor_dzialu = "BEATAD") %>%
  select(names(do_przedmiotowej1))
#dla książek, które nie mają wypełnionego osoba_bn_autor - przypisanie do Marty z x? czy losowo do kogoś?
do_przedmiotowej5 <- przedmiotowa_redaktorzy %>%
  filter(is.na(osoba_bn_autor)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         DZ_DZIAL_ID = NA,
         DZ_NAZWA = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym",
         redaktor_dzialu = "MARTAKx") %>%
  select(names(do_przedmiotowej1))
#połaczenie wszystkich przedmiotowych z przypisanymi redaktorami w jeden plik
do_przedmiotowej <- rbind(do_przedmiotowej,do_przedmiotowej4,do_przedmiotowej5)
#dla książek, które mają wypełnione osoba_bn_autor - zmiana na podmiotową do ręcznego przejrzenia i przypisanie redaktorów
###przypisanie do podmiotowej!!!!!!!!!!!!!!!!!!!###############
do_podmiotowej1 <- przedmiotowa_redaktorzy %>%
  filter(!is.na(osoba_bn_autor))
#trzeba zaktualizować w bn_ok, że teraz to są podmiotowe
#lista rekordów do przepisania z przedmiotowej na podmiotową
lista_do_przepisania <- do_podmiotowej1$ZA_UWAGI
bn_ok$rodzaj_ksiazki[bn_ok$ZA_UWAGI %in% lista_do_przepisania] <- "podmiotowa"
#to, co było podmiotową bez autora powinno trafić do literatury anonimowej z pracownikiem przedm, więc teraz trzeba to przepisać do przedmiotowej - na końcu procesu
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa"&X100=="")
#przypisanie literatury anonimowej
#655
marc_field_655 <- podmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X655)%>%
  filter(X655!="") %>%
  mutate(X655=str_replace_all(X655,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X655",sep = "~",direction = "long") %>%
  filter(X655!="") %>%
  mutate(X655=str_remove_all(X655,"^\\|")) %>%
  mutate(indicator = str_replace_all(X655,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X655,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_655)[1]))
colnames(empty_table) <-subfield_list
marc_field_655<-cbind(marc_field_655,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_655$X655 <- str_replace(marc_field_655$X655,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_655[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_655$X655),str_replace_all(gsub(string,"\\3",marc_field_655$X655),"\\${2}.", "~"),NA)
}

marc_field_655 <- marc_field_655 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique()
trim <- function (x) gsub("^\\s+|\\s+$", "", x)
PBL_literatury_anonimowe <- PBL_dzialy_path %>%
  filter(grepl("Utwory anonim",DZ_NAZWA)) %>%
  select(DZ_DZIAL_ID,DZ_NAZWA,NAD_NAD_DZ_DZIAL_ID) %>%
  left_join(.,redaktorzy_dzialow,by = c("NAD_NAD_DZ_DZIAL_ID"="DZ_DZIAL_ID")) %>%
  select(1,DZ_NAZWA = 2,5) %>%
  filter(DZ_DZIAL_ID %notin% c(1922,1983)) %>%
  group_by(DZ_DZIAL_ID) %>%
  mutate(nazwa = paste(trim(unlist(str_extract_all(DZ_NAZWA,"(?<=\\()(.*?)(?=\\(|\\))"))),collapse = "|"),
         nazwa = str_remove_all(nazwa,"(.)(?=\\||$)"),
         nazwa = str_remove(nazwa,"literatur. "),
         nazwa = ifelse(nazwa=="","polsk",as.character(nazwa)),
         redaktor_dzialu = ifelse(is.na(redaktor_dzialu),"ANIA",as.character(redaktor_dzialu))) %>%
  ungroup()

reczne <- data.frame(DZ_DZIAL_ID = c(899,694,694,1174,145,1220),DZ_NAZWA = c("Utwory anonimowe (Indii)","Utwory anonimowe (brytyjska i irlandzka)","Utwory anonimowe (brytyjska i irlandzka)","Utwory anonimowe (starosłowiańska)","Utwory anonimowe i ulotne","Utwory anonimowe (turecka)"), redaktor_dzialu = c("EWA","BEATAK","BEATAK","BEATAD","ANIA","EWA"), nazwa = c("indyjsk","walijsk","angielsk","starorusk","kaszubsk","nogajsk"))

PBL_literatury_anonimowe <- rbind(PBL_literatury_anonimowe,reczne)

marc_field_655 <- sqldf("select *
                            from marc_field_655 a
                            left join PBL_literatury_anonimowe b on a.`$a` like ('%'||b.nazwa||'%')") %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)

marc_field_655$same <- cumsum(!duplicated(marc_field_655[1]))
marc_field_655 <- marc_field_655[!duplicated(marc_field_655$same),] %>%
  select(ZA_UWAGI,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(marc_field_600))
###przypisanie do redaktorów literatury anonimowej na podstawie literatury z pola 650
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa"&X100=="") %>%
  filter(ZA_UWAGI %notin% marc_field_655$ZA_UWAGI)

#650
marc_field_650 <- podmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X650)%>%
  filter(X650!="") %>%
  mutate(X650=str_replace_all(X650,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X650",sep = "~",direction = "long") %>%
  filter(X650!="") %>%
  mutate(X650=str_remove_all(X650,"^\\|")) %>%
  mutate(indicator = str_replace_all(X650,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X650,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_650)[1]))
colnames(empty_table) <-subfield_list
marc_field_650<-cbind(marc_field_650,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_650$X650 <- str_replace(marc_field_650$X650,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_650[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_650$X650),str_replace_all(gsub(string,"\\3",marc_field_650$X650),"\\${2}.", "~"),NA)
}

marc_field_650 <- marc_field_650 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique()

marc_field_650 <- sqldf("select *
                            from marc_field_650 a
                            left join PBL_literatury_anonimowe b on a.`$a` like ('%'||b.nazwa||'%')") %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)

marc_field_650$same <- cumsum(!duplicated(marc_field_650[1]))
marc_field_650 <- marc_field_650[!duplicated(marc_field_650$same),] %>%
  select(ZA_UWAGI,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(marc_field_600))
do_podmiotowej1 <- rbind(marc_field_655,marc_field_650)

#co zrobić z pozostałymi podmiotowymi anonimowymi, których nie udało się przypisać?
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa"&X100=="") %>%
  filter(ZA_UWAGI %notin% do_podmiotowej1$ZA_UWAGI) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         DZ_DZIAL_ID = NA,
         DZ_NAZWA = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym",
         redaktor_dzialu = "KAROLINA") %>%
  select(names(do_przedmiotowej1))
do_podmiotowej1 <- rbind(do_podmiotowej1,podmiotowa_redaktorzy)

#lista rekordów do przepisania z podmiotowej na przedmiotową (chodzi o literaturę anonimową)
lista_do_przepisania <- do_podmiotowej1$ZA_UWAGI
bn_ok$rodzaj_ksiazki[bn_ok$ZA_UWAGI %in% lista_do_przepisania] <- "przedmiotowa"

#przetworzenie całej podmiotowej (bo plik do_podmiotowej1 już jest w środku)
###przypisanie redaktora na podstawie osoby z 100 jako twórcy (autora) (tabela pbl-bn-viaf)- książki twórcy
#100
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  filter(ZA_UWAGI %notin% do_podmiotowej1$ZA_UWAGI)

marc_field_100 <- podmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}
marc_field_100 <- marc_field_100 %>%
  select(ZA_UWAGI,`$a`,`$d`,`$c`) %>%
  mutate(name = ifelse(!is.na(`$c`)&substr(`$c`,nchar(`$c`),nchar(`$c`))==";",paste(`$a`,`$c`,`$d`,sep = " "),ifelse(!is.na(`$d`),paste(`$a`,`$d`,sep = " "),as.character(`$a`)))) %>%
  select(ZA_UWAGI,name) %>%
  mutate(name = str_replace(name,"(\\))(\\.$)","\\1"),
         name = str_replace(name, "([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)","\\1")) %>%
  group_by(ZA_UWAGI) %>%
  mutate(name = paste(name,collapse = "|")) %>%
  ungroup() %>%
  unique()

do_podmiotowej2 <- marc_field_100 %>%
  unique() %>%
  inner_join(.,pbl_viaf,by = c("name" = "BN_name")) %>%
  inner_join(.,PBL_tworcy,by = c("pbl_id"="TW_TWORCA_ID")) %>%
  left_join(.,redaktorzy_dzialow,by = c("TW_DZ_DZIAL_ID"="DZ_DZIAL_ID")) %>%
  select(ZA_UWAGI,TW_TWORCA_ID=pbl_id,TW_NAZWISKO,TW_IMIE,DZ_DZIAL_ID=TW_DZ_DZIAL_ID,DZ_NAZWA=DZ_NAZWA.x,redaktor_dzialu) %>%
  mutate(RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)") %>%
  unique()

###przypisanie redaktora na podstawie zbieżności fraz nazewnictwa osoby z 100 z twórcą pbl (dla tych, które nie zostały zmapowane na linii pbl-bn) - książki twórcy
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  filter(ZA_UWAGI %notin% do_podmiotowej1$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej2$ZA_UWAGI)

#100
marc_field_100 <- podmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}

do_podmiotowej3 <- marc_field_100 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique() %>%
  mutate(`$a` = str_remove(`$a`,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)")) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(`$a`,collapse = "|")) %>%
  ungroup() %>%
  unique() %>%
  mutate(TW_NAZWISKO = ifelse(grepl("\\|",`$a`), str_replace_all(str_remove_all(`$a`,","),"\\|",", "),
                              ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\1"),as.character(`$a`))),
         TW_IMIE = ifelse(grepl("\\|",`$a`),"*",
                          ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\3"),"*")),
         nazwa = str_replace_all(str_to_lower(paste(TW_NAZWISKO,TW_IMIE,sep = "")), "\\W", "")) %>%
  select(ZA_UWAGI,TW_NAZWISKO,TW_IMIE,nazwa) %>% 
  inner_join(.,PBL_tworcy_podm %>% select(TW_TWORCA_ID,DZ_DZIAL_ID=TW_DZ_DZIAL_ID,DZ_NAZWA,nazwa),by="nazwa")
do_podmiotowej3$same <- cumsum(!duplicated(do_podmiotowej3[1:4]))
do_podmiotowej3 <- do_podmiotowej3 %>% 
  arrange(ZA_UWAGI,TW_NAZWISKO,TW_IMIE,nazwa,TW_TWORCA_ID)
do_podmiotowej3 <- do_podmiotowej3[!duplicated(do_podmiotowej3$same),] %>% 
  mutate(DZ_DZIAL_ID = as.integer(DZ_DZIAL_ID),
         RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)") %>% 
  inner_join(.,redaktorzy_dzialow %>% select(DZ_DZIAL_ID,redaktor_dzialu),by="DZ_DZIAL_ID") %>% 
  select(names(do_podmiotowej1))

###przypisanie autorów podmiotowej do literatur i przypisanie do redaktorów na podstawie kodu literatury z pola X080 i tworzenie nowych twórców na podstawie pola 100
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  filter(ZA_UWAGI %notin% do_podmiotowej1$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej2$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej3$ZA_UWAGI)

podmiotowa_redaktorzy <- sqldf("select *
                            from podmiotowa_redaktorzy a
                            join BN_PBL_lista_literatur b on a.X080 like ('%'||b.ukd_ogolne||'%')")

###dodawanie nazewnictw nowych twórców
#100
marc_field_100 <- podmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}

marc_field_100 <- marc_field_100 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique() %>%
  mutate(`$a` = str_remove(`$a`,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)")) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(`$a`,collapse = "|")) %>%
  ungroup() %>%
  unique() %>%
  mutate(TW_NAZWISKO = ifelse(grepl("\\|",`$a`), str_replace_all(str_remove_all(`$a`,","),"\\|",", "),
                              ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\1"),as.character(`$a`))),
         TW_IMIE = ifelse(grepl("\\|",`$a`),"*",
                          ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\3"),"*"))) %>%
  select(ZA_UWAGI,TW_NAZWISKO,TW_IMIE)
#join na podstawie identycznego id
podmiotowa_redaktorzy <- podmiotowa_redaktorzy %>%
  left_join(.,marc_field_100,by="ZA_UWAGI") %>%
  mutate(pbl_nazwa = as.character(pbl_nazwa)) %>%
  mutate(DZ_DZIAL_ID = ifelse(nazwa_prosta=="polsk"&substr(pbl_nazwa,nchar(pbl_nazwa),nchar(pbl_nazwa))!=substr(TW_NAZWISKO,1,1),NA,as.integer(pbl_id))) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)

count <- as.data.frame(table(podmiotowa_redaktorzy$ZA_UWAGI))
podmiotowa_redaktorzy <- merge(podmiotowa_redaktorzy,count,by.x = "ZA_UWAGI",by.y = "Var1") %>%
  mutate(dlugosc = nchar(ukd_ogolne)) %>%
  arrange(-Freq,ZA_UWAGI,-dlugosc,pbl_id)
podmiotowa_redaktorzy$same <- cumsum(!duplicated(podmiotowa_redaktorzy[1]))
do_podmiotowej4 <- podmiotowa_redaktorzy[!duplicated(podmiotowa_redaktorzy$same),] %>%
  mutate(TW_TWORCA_ID = NA) %>%
  rename(DZ_NAZWA = pbl_nazwa) %>%
  select(ZA_UWAGI,TW_TWORCA_ID,TW_NAZWISKO,TW_IMIE,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  mutate(RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)")

###przypisanie autorów podmiotowej do literatur i przypisanie do redaktorów na podstawie literatury z pola 655 i tworzenie nowych twórców na podstawie pola 100
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  filter(ZA_UWAGI %notin% do_podmiotowej1$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej2$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej3$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej4$ZA_UWAGI)

#655
marc_field_655 <- podmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X655)%>%
  filter(X655!="") %>%
  mutate(X655=str_replace_all(X655,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X655",sep = "~",direction = "long") %>%
  filter(X655!="") %>%
  mutate(X655=str_remove_all(X655,"^\\|")) %>%
  mutate(indicator = str_replace_all(X655,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X655,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_655)[1]))
colnames(empty_table) <-subfield_list
marc_field_655<-cbind(marc_field_655,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_655$X655 <- str_replace(marc_field_655$X655,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_655[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_655$X655),str_replace_all(gsub(string,"\\3",marc_field_655$X655),"\\${2}.", "~"),NA)
}

marc_field_655 <- marc_field_655 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique()

marc_field_655 <- sqldf("select *
                            from marc_field_655 a
                            left join PBL_hasla_osobowe b on a.`$a` like ('%'||b.nazwa||'%')")

###dodawanie nazewnictw nowych twórców
#100
marc_field_100 <- podmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}

marc_field_100 <- marc_field_100 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique() %>%
  mutate(`$a` = str_remove(`$a`,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)")) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(`$a`,collapse = "|")) %>%
  ungroup() %>%
  unique() %>%
  mutate(TW_NAZWISKO = ifelse(grepl("\\|",`$a`), str_replace_all(str_remove_all(`$a`,","),"\\|",", "),
                              ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\1"),as.character(`$a`))),
         TW_IMIE = ifelse(grepl("\\|",`$a`),"*",
                          ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\3"),"*"))) %>%
  select(ZA_UWAGI,TW_NAZWISKO,TW_IMIE)
#join na podstawie identycznego id
marc_field_655 <- marc_field_655 %>%
  left_join(.,marc_field_100,by="ZA_UWAGI") %>%
  mutate(DZ_DZIAL_ID = ifelse(nazwa=="polsk"&substr(DZ_NAZWA,nchar(DZ_NAZWA),nchar(DZ_NAZWA))!=substr(TW_NAZWISKO,1,1),NA,as.integer(DZ_DZIAL_ID))) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)
    
marc_field_655$same <- cumsum(!duplicated(marc_field_655[1]))
do_podmiotowej5 <- marc_field_655[!duplicated(marc_field_655$same),] %>%
  select(ZA_UWAGI,DZ_DZIAL_ID,DZ_NAZWA,TW_NAZWISKO,TW_IMIE,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)") %>%
  select(names(marc_field_600))

###przypisanie autorów podmiotowej do literatur i przypisanie do redaktorów na podstawie literatury z pola 655 i tworzenie nowych twórców na podstawie pola 100
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  filter(ZA_UWAGI %notin% do_podmiotowej1$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej2$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej3$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej4$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej5$ZA_UWAGI)

#650
marc_field_650 <- podmiotowa_redaktorzy %>%
  select(ZA_UWAGI,X650)%>%
  filter(X650!="") %>%
  mutate(X650=str_replace_all(X650,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X650",sep = "~",direction = "long") %>%
  filter(X650!="") %>%
  mutate(X650=str_remove_all(X650,"^\\|")) %>%
  mutate(indicator = str_replace_all(X650,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(podmiotowa_redaktorzy$X650,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_650)[1]))
colnames(empty_table) <-subfield_list
marc_field_650<-cbind(marc_field_650,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_650$X650 <- str_replace(marc_field_650$X650,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_650[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_650$X650),str_replace_all(gsub(string,"\\3",marc_field_650$X650),"\\${2}.", "~"),NA)
}

marc_field_650 <- marc_field_650 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique()

marc_field_650 <- sqldf("select *
                            from marc_field_650 a
                            left join PBL_hasla_osobowe b on a.`$a` like ('%'||b.nazwa||'%')")  %>%
  left_join(.,marc_field_100,by="ZA_UWAGI") %>%
  mutate(DZ_DZIAL_ID = ifelse(nazwa=="polsk"&substr(DZ_NAZWA,nchar(DZ_NAZWA),nchar(DZ_NAZWA))!=substr(TW_NAZWISKO,1,1),NA,as.integer(DZ_DZIAL_ID))) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)

marc_field_650$same <- cumsum(!duplicated(marc_field_650[1]))
do_podmiotowej6 <- marc_field_650[!duplicated(marc_field_650$same),] %>%
  select(ZA_UWAGI,DZ_DZIAL_ID,DZ_NAZWA,TW_NAZWISKO,TW_IMIE,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)") %>%
  select(names(marc_field_600))
#co zostało do podmiotowej?
podmiotowa_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  filter(ZA_UWAGI %notin% do_podmiotowej1$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej2$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej3$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej4$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej5$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_podmiotowej6$ZA_UWAGI)
#naddatek przypisać Marcie jako podmiotową bez twórców i czy_automatycznie <- nie
do_podmiotowej7 <- podmiotowa_redaktorzy %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         DZ_DZIAL_ID = NA,
         DZ_NAZWA = NA,
         RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)",
         redaktor_dzialu = "MARTAKx") %>%
  select(names(do_podmiotowej5))
#trzeba zaktualizować w bn_ok, że teraz to nie są automatyczne
lista_do_przepisania <- do_podmiotowej7$ZA_UWAGI
bn_ok$czy_automatycznie[bn_ok$ZA_UWAGI %in% lista_do_przepisania] <- "nie"
#połączenie przydziału podmiotowych w jeden plik
do_podmiotowej <- rbind(do_podmiotowej1,do_podmiotowej2,do_podmiotowej3,do_podmiotowej4,do_podmiotowej5,do_podmiotowej6,do_podmiotowej7)

#przypisanie antologii do Tomka i do literatur na podstawie 080
antologie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki == "antologia")
PBL_dzialy_antologie <- PBL_dzialy_path %>%
  filter(grepl("antolog",DZ_NAZWA,ignore.case = TRUE)) %>%
  left_join(.,redaktorzy_dzialow,by="DZ_DZIAL_ID") %>%
  select(DZ_DZIAL_ID,DZ_NAZWA=DZ_NAZWA.x,redaktor_dzialu) %>%
  mutate(redaktor_dzialu = ifelse(is.na(redaktor_dzialu),"TOMASZ",as.character(redaktor_dzialu)))

PBL_dzialy_antologie <- sqldf("select *
                            from PBL_dzialy_antologie a
                            left join (select c.ukd_ogolne,c.nazwa_prosta,c.pbl_id,c.pbl_nazwa,c.pbl_id_literatury,c.pbl_literatura from BN_PBL_lista_literatur c) b on a.DZ_NAZWA like ('%'||b.nazwa_prosta||'%')") %>%
  mutate(ukd_ogolne = ifelse(DZ_DZIAL_ID==146,"821.162.1",as.character(ukd_ogolne)),
         nazwa_prosta = ifelse(DZ_DZIAL_ID==146,"polsk",as.character(nazwa_prosta))) %>%
  filter(!is.na(ukd_ogolne)) %>%
  filter(DZ_DZIAL_ID!=744) %>%
  select(1:5) 

antologie_redaktorzy <- sqldf("select *
                            from antologie_redaktorzy a
                            join PBL_dzialy_antologie b on a.X080 like ('%'||b.ukd_ogolne||'%')")

count <- as.data.frame(table(antologie_redaktorzy$ZA_UWAGI))
antologie_redaktorzy <- merge(antologie_redaktorzy,count,by.x = "ZA_UWAGI",by.y = "Var1") %>%
  mutate(dlugosc = nchar(ukd_ogolne)) %>%
  arrange(-Freq,ZA_UWAGI,-dlugosc,DZ_DZIAL_ID)
antologie_redaktorzy$same <- cumsum(!duplicated(antologie_redaktorzy[1]))
do_antologii1 <- antologie_redaktorzy[!duplicated(antologie_redaktorzy$same),] %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA) %>%
  select(ZA_UWAGI,TW_TWORCA_ID,TW_NAZWISKO,TW_IMIE,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  mutate(RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym")
#przypisanie antologii do Tomka i do literatur na podstawie 665
antologie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki == "antologia") %>%
  filter(ZA_UWAGI %notin% do_antologii1$ZA_UWAGI)

marc_field_655 <- antologie_redaktorzy %>%
  select(ZA_UWAGI,X655)%>%
  filter(X655!="") %>%
  mutate(X655=str_replace_all(X655,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X655",sep = "~",direction = "long") %>%
  filter(X655!="") %>%
  mutate(X655=str_remove_all(X655,"^\\|")) %>%
  mutate(indicator = str_replace_all(X655,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(antologie_redaktorzy$X655,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_655)[1]))
colnames(empty_table) <-subfield_list
marc_field_655<-cbind(marc_field_655,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_655$X655 <- str_replace(marc_field_655$X655,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_655[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_655$X655),str_replace_all(gsub(string,"\\3",marc_field_655$X655),"\\${2}.", "~"),NA)
}

marc_field_655 <- marc_field_655 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique()

marc_field_655 <- sqldf("select *
                            from marc_field_655 a
                            left join PBL_dzialy_antologie b on a.`$a` like ('%'||b.nazwa_prosta||'%')") %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)

marc_field_655$same <- cumsum(!duplicated(marc_field_655[1]))
do_antologii2 <- marc_field_655[!duplicated(marc_field_655$same),] %>%
  select(ZA_UWAGI,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(do_antologii1))
#przypisanie antologii do Tomka i do literatur na podstawie 665
antologie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki == "antologia") %>%
  filter(ZA_UWAGI %notin% do_antologii1$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_antologii2$ZA_UWAGI)

marc_field_650 <- antologie_redaktorzy %>%
  select(ZA_UWAGI,X650)%>%
  filter(X650!="") %>%
  mutate(X650=str_replace_all(X650,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X650",sep = "~",direction = "long") %>%
  filter(X650!="") %>%
  mutate(X650=str_remove_all(X650,"^\\|")) %>%
  mutate(indicator = str_replace_all(X650,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(antologie_redaktorzy$X650,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_650)[1]))
colnames(empty_table) <-subfield_list
marc_field_650<-cbind(marc_field_650,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_650$X650 <- str_replace(marc_field_650$X650,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_650[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_650$X650),str_replace_all(gsub(string,"\\3",marc_field_650$X650),"\\${2}.", "~"),NA)
}

marc_field_650 <- marc_field_650 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique()

marc_field_650 <- sqldf("select *
                            from marc_field_650 a
                            left join PBL_dzialy_antologie b on a.`$a` like ('%'||b.nazwa_prosta||'%')") %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)

marc_field_650$same <- cumsum(!duplicated(marc_field_650[1]))
do_antologii3 <- marc_field_650[!duplicated(marc_field_650$same),] %>%
  select(ZA_UWAGI,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym") %>%
  select(names(do_antologii1))
#reszta antologii bez działu po prostu przypisana do Tomka
antologie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki == "antologia") %>%
  filter(ZA_UWAGI %notin% do_antologii1$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_antologii2$ZA_UWAGI) %>%
  filter(ZA_UWAGI %notin% do_antologii3$ZA_UWAGI)

do_antologii4 <- antologie_redaktorzy %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         DZ_DZIAL_ID = NA,
         DZ_NAZWA = NA,
         RZ_RODZAJ_ID = 21,
         RZ_NAZWA = "książka w haśle rzeczowym",
         redaktor_dzialu = "TOMASZ") %>%
  select(names(do_antologii1))

do_antologii <- rbind(do_antologii1,do_antologii2,do_antologii3,do_antologii4)
###przypisanie redaktora do współwydań na podstawie osoby z 245 jako twórcy (autora) (tabela pbl-bn-viaf)- książki twórcy
wspolwydanie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="współwydanie")

do_wspolwydania1 <- wspolwydanie_redaktorzy %>% 
  select(ZA_UWAGI,X245) %>% 
  mutate(X245 = str_extract(X245, "(?<=\\/\\$c)(.*?)(?= ;|$)"),
         X245 = str_remove(X245,"\\.$"),
         X245 = str_remove(X245,"\\["),
         X245 = str_remove(X245,"\\]"),
         nazwisko = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),as.character(X245),str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\3")),
         imie = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),"*",str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\1")),
         name = paste(nazwisko,imie,sep = ", ")) %>%
  inner_join(.,pbl_viaf,by = c("name" = "BN_name")) %>%
  left_join(.,PBL_tworcy,by = c("pbl_id"="TW_TWORCA_ID")) %>%
  left_join(.,redaktorzy_dzialow,by = c("TW_DZ_DZIAL_ID"="DZ_DZIAL_ID")) %>%
  select(ZA_UWAGI,TW_TWORCA_ID=pbl_id,TW_NAZWISKO,TW_IMIE,DZ_DZIAL_ID=TW_DZ_DZIAL_ID,DZ_NAZWA=DZ_NAZWA.x,redaktor_dzialu) %>%
  mutate(RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)") %>%
  unique()
###przypisanie redaktora na podstawie zbieżności fraz nazewnictwa osoby z 245 z twórcą pbl (dla tych, które nie zostały zmapowane na linii pbl-bn) - książki twórcy
wspolwydanie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="współwydanie") %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania1$ZA_UWAGI)

do_wspolwydania2 <- wspolwydanie_redaktorzy %>% 
  select(ZA_UWAGI,X245) %>% 
  mutate(X245 = str_extract(X245, "(?<=\\/\\$c)(.*?)(?= ;|$)"),
         X245 = str_remove(X245,"\\.$"),
         X245 = str_remove(X245,"\\["),
         X245 = str_remove(X245,"\\]"),
         nazwisko = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),as.character(X245),str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\3")),
         imie = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),"*",str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\1")),
         name = paste(nazwisko,imie,sep = ", "),
         nazwa = str_replace_all(str_to_lower(name), "\\W", "")) %>% 
  inner_join(.,PBL_tworcy_podm %>% select(TW_TWORCA_ID,TW_NAZWISKO,TW_IMIE,DZ_DZIAL_ID=TW_DZ_DZIAL_ID,DZ_NAZWA,nazwa),by="nazwa")
do_wspolwydania2$same <- cumsum(!duplicated(do_wspolwydania2[1:4]))
do_wspolwydania2 <- do_wspolwydania2 %>% 
  arrange(ZA_UWAGI,nazwisko,imie,nazwa,TW_TWORCA_ID)
do_wspolwydania2 <- do_wspolwydania2[!duplicated(do_wspolwydania2$same),] %>% 
  mutate(DZ_DZIAL_ID = as.integer(DZ_DZIAL_ID),
         RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)") %>% 
  inner_join(.,redaktorzy_dzialow %>% select(DZ_DZIAL_ID,redaktor_dzialu),by="DZ_DZIAL_ID") %>% 
  select(names(do_wspolwydania1))
###przypisanie autorów podmiotowej do literatur i przypisanie do redaktorów na podstawie kodu literatury z pola X080 i tworzenie nowych twórców na podstawie pola 245
wspolwydanie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="współwydanie") %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania1$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania2$ZA_UWAGI)

wspolwydanie_redaktorzy <- sqldf("select *
                            from wspolwydanie_redaktorzy a
                            join BN_PBL_lista_literatur b on a.X080 like ('%'||b.ukd_ogolne||'%')")
do_wspolwydania3 <- wspolwydanie_redaktorzy %>% 
  select(ZA_UWAGI,X245,pbl_id,pbl_nazwa,redaktor_dzialu,pbl_id_literatury,pbl_literatura,nazwa_prosta,ukd_ogolne) %>% 
  mutate(X245 = str_extract(X245, "(?<=\\/\\$c)(.*?)(?= ;|$)"),
         X245 = str_remove(X245,"\\.$"),
         X245 = str_remove(X245,"\\["),
         X245 = str_remove(X245,"\\]"),
         nazwisko = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),as.character(X245),str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\3")),
         imie = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),"*",str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\1")),
         name = paste(nazwisko,imie,sep = ", ")) %>%
  mutate(pbl_nazwa = as.character(pbl_nazwa)) %>%
  mutate(DZ_DZIAL_ID = ifelse(nazwa_prosta=="polsk"&substr(pbl_nazwa,nchar(pbl_nazwa),nchar(pbl_nazwa))!=substr(nazwisko,1,1),NA,as.integer(pbl_id))) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)
count <- as.data.frame(table(do_wspolwydania3$ZA_UWAGI))
do_wspolwydania3 <- merge(do_wspolwydania3,count,by.x = "ZA_UWAGI",by.y = "Var1") %>%
  mutate(dlugosc = nchar(ukd_ogolne)) %>%
  arrange(-Freq,ZA_UWAGI,-dlugosc,pbl_id)
do_wspolwydania3$same <- cumsum(!duplicated(do_wspolwydania3[1]))
do_wspolwydania3 <- do_wspolwydania3[!duplicated(do_wspolwydania3$same),] %>%
  mutate(TW_TWORCA_ID = NA) %>%
  rename(DZ_NAZWA = pbl_nazwa,
         TW_NAZWISKO = nazwisko,
         TW_IMIE = imie) %>%
  select(ZA_UWAGI,TW_TWORCA_ID,TW_NAZWISKO,TW_IMIE,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  mutate(RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)")
###przypisanie autorów podmiotowej do literatur i przypisanie do redaktorów na podstawie literatury z pola 655 i tworzenie nowych twórców na podstawie pola 245
wspolwydanie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="współwydanie") %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania1$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania2$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania3$ZA_UWAGI)

#655
marc_field_655 <- wspolwydanie_redaktorzy %>%
  select(ZA_UWAGI,X655)%>%
  filter(X655!="") %>%
  mutate(X655=str_replace_all(X655,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X655",sep = "~",direction = "long") %>%
  filter(X655!="") %>%
  mutate(X655=str_remove_all(X655,"^\\|")) %>%
  mutate(indicator = str_replace_all(X655,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(wspolwydanie_redaktorzy$X655,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_655)[1]))
colnames(empty_table) <-subfield_list
marc_field_655<-cbind(marc_field_655,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_655$X655 <- str_replace(marc_field_655$X655,subfield_list_char[i],"|\\1")
}
if (nrow(marc_field_655)>0) {
  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_655[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_655$X655),str_replace_all(gsub(string,"\\3",marc_field_655$X655),"\\${2}.", "~"),NA)
}

marc_field_655 <- marc_field_655 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique()

marc_field_655 <- sqldf("select *
                            from marc_field_655 a
                            left join PBL_hasla_osobowe b on a.`$a` like ('%'||b.nazwa||'%')")

###dodawanie nazewnictw nowych twórców na podstawie 245
marc_field_245 <- wspolwydanie_redaktorzy %>% 
  select(ZA_UWAGI,X245) %>% 
  mutate(X245 = str_extract(X245, "(?<=\\/\\$c)(.*?)(?= ;|$)"),
         X245 = str_remove(X245,"\\.$"),
         X245 = str_remove(X245,"\\["),
         X245 = str_remove(X245,"\\]"),
         nazwisko = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),as.character(X245),str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\3")),
         imie = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),"*",str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\1")),
         name = paste(nazwisko,imie,sep = ", "))
#join na podstawie identycznego id
marc_field_655 <- marc_field_655 %>%
  left_join(.,marc_field_245,by="ZA_UWAGI") %>%
  mutate(DZ_DZIAL_ID = ifelse(nazwa=="polsk"&substr(DZ_NAZWA,nchar(DZ_NAZWA),nchar(DZ_NAZWA))!=substr(nazwisko,1,1),NA,as.integer(DZ_DZIAL_ID))) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)
marc_field_655$same <- cumsum(!duplicated(marc_field_655[1]))
do_wspolwydania4 <- marc_field_655[!duplicated(marc_field_655$same),] %>%
  select(ZA_UWAGI,DZ_DZIAL_ID,DZ_NAZWA,TW_NAZWISKO=nazwisko,TW_IMIE=imie,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)") %>%
  select(names(do_wspolwydania3))
} else {
  marc_field_245 <- wspolwydanie_redaktorzy %>% 
  select(ZA_UWAGI,X245) %>% 
  mutate(X245 = str_extract(X245, "(?<=\\/\\$c)(.*?)(?= ;|$)"),
         X245 = str_remove(X245,"\\.$"),
         X245 = str_remove(X245,"\\["),
         X245 = str_remove(X245,"\\]"),
         nazwisko = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),as.character(X245),str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\3")),
         imie = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),"*",str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\1")),
         name = paste(nazwisko,imie,sep = ", "))
  do_wspolwydania4 <- data.frame(stringsAsFactors = FALSE)
}
###przypisanie autorów podmiotowej do literatur i przypisanie do redaktorów na podstawie literatury z pola 650 i tworzenie nowych twórców na podstawie pola 245
wspolwydanie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="współwydanie") %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania1$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania2$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania3$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania4$ZA_UWAGI)

#650
if (max(nchar(wspolwydanie_redaktorzy$X650))>0) {
marc_field_650 <- wspolwydanie_redaktorzy %>%
  select(ZA_UWAGI,X650)%>%
  filter(X650!="") %>%
  mutate(X650=str_replace_all(X650,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X650",sep = "~",direction = "long") %>%
  filter(X650!="") %>%
  mutate(X650=str_remove_all(X650,"^\\|")) %>%
  mutate(indicator = str_replace_all(X650,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(wspolwydanie_redaktorzy$X650,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_650)[1]))
colnames(empty_table) <-subfield_list
marc_field_650<-cbind(marc_field_650,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_650$X650 <- str_replace(marc_field_650$X650,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_650[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_650$X650),str_replace_all(gsub(string,"\\3",marc_field_650$X650),"\\${2}.", "~"),NA)
}

marc_field_650 <- marc_field_650 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique()

marc_field_650 <- sqldf("select *
                            from marc_field_650 a
                            left join PBL_hasla_osobowe b on a.`$a` like ('%'||b.nazwa||'%')")  %>%
  left_join(.,marc_field_245,by="ZA_UWAGI") %>%
  mutate(DZ_DZIAL_ID = ifelse(nazwa=="polsk"&substr(DZ_NAZWA,nchar(DZ_NAZWA),nchar(DZ_NAZWA))!=substr(nazwisko,1,1),NA,as.integer(DZ_DZIAL_ID))) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  arrange(ZA_UWAGI,DZ_DZIAL_ID)

marc_field_650$same <- cumsum(!duplicated(marc_field_650[1]))
do_wspolwydania5 <- marc_field_650[!duplicated(marc_field_650$same),] %>%
  select(ZA_UWAGI,DZ_DZIAL_ID,DZ_NAZWA,TW_NAZWISKO=nazwisko,TW_IMIE=imie,redaktor_dzialu) %>%
  filter(!is.na(DZ_DZIAL_ID)) %>%
  mutate(TW_TWORCA_ID = NA,
         RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)") %>%
  select(names(do_wspolwydania4))
} else {
  do_wspolwydania5 <- do_wspolwydania1[0,]
}
#co zostało do współwydania?
wspolwydanie_redaktorzy <- bn_ok %>%
  filter(rodzaj_ksiazki=="współwydanie") %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania1$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania2$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania3$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania4$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% do_wspolwydania5$ZA_UWAGI)

#naddatek przypisać Marcie jako podmiotową bez twórców i czy_automatycznie <- nie
do_wspolwydania6 <- wspolwydanie_redaktorzy %>%
  mutate(TW_TWORCA_ID = NA,
         TW_NAZWISKO = NA,
         TW_IMIE = NA,
         DZ_DZIAL_ID = NA,
         DZ_NAZWA = NA,
         RZ_RODZAJ_ID = 1,
         RZ_NAZWA = "książka twórcy (podmiotowa)",
         redaktor_dzialu = "MARTAKx") %>%
  select(names(do_wspolwydania5))
#trzeba zaktualizować w bn_ok, że teraz to nie są automatyczne
lista_do_przepisania <- do_wspolwydania6$ZA_UWAGI
bn_ok$czy_automatycznie[bn_ok$ZA_UWAGI %in% lista_do_przepisania] <- "nie"
#połączenie przydziału współwydań w jeden plik
do_wspolwydania <- rbind(do_wspolwydania1,do_wspolwydania2,do_wspolwydania3,do_wspolwydania4,do_wspolwydania5,do_wspolwydania6)

#połączenie przydziałów w jeden plik (z wykluczeniem współwydania, bo ono idzie po za_uwagi)
redaktorzy_zapisow <- rbind(do_podmiotowej,do_przedmiotowej,do_antologii,do_wspolwydania)
#połączenie przypisania ze zbiorem

bn_ok <- bn_ok %>%
  left_join(.,redaktorzy_zapisow,by="ZA_UWAGI") %>%
  mutate(redaktor_dzialu = ifelse(is.na(DZ_NAZWA),as.character(redaktor_dzialu),
                                  ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - B","PAULINA",
                                         ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - G","MARTAK",
                                                ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - L","BEATAK",
                                                       ifelse(DZ_NAZWA=="Literatura współczesna (utwory anonimowe i ulotne)","ANIA",
                                                              ifelse(DZ_NAZWA=="Utwory anonimowe i ulotne","ANIA",
                                                                     ifelse(DZ_NAZWA=="Utwory anonimowe i ulotne (epoka nieznana)","ANIA",
                                                                            ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - N","GOSIA",
                                                                                   ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - O","IZA",
                                                                                          ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - Q","IZA",
                                                                                                 ifelse(DZ_NAZWA=="Literatura brytyjska i irlandzka","EWA",
                                                                                                        ifelse(DZ_NAZWA=="Utwory anonimowe (brytyjska i irlandzka)","EWA",
                                                                                                               ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - U","PAULINA",
                                                                                                                      ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - X","PAULINA",
                                                                                                                             ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - V","PAULINA",
                                                                                                                                    ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - Y","PAULINA",
                                                                                                                                           ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - C","GOSIA",
                                                                                                                                                  ifelse(DZ_NAZWA=="Hasła osobowe (literatura polska) - D","GOSIA",as.character(redaktor_dzialu))))))))))))))))))))

#ujednolicenie literatury dla kilku zapisów nowego twórcy
kilka_literatur_nowego_tworcy <- bn_ok %>%
  select(id,TW_TWORCA_ID,TW_NAZWISKO,TW_IMIE,DZ_DZIAL_ID,DZ_NAZWA,redaktor_dzialu) %>%
  filter(is.na(TW_TWORCA_ID)&!is.na(TW_NAZWISKO)) %>%
  select(-TW_TWORCA_ID) %>%
  arrange(TW_NAZWISKO,TW_IMIE) %>%
  group_by_at(vars(2:3)) %>%
  mutate(unikatowy_dzial = paste(unique(DZ_DZIAL_ID),collapse = "|"),
         DZ_DZIAL_ID = paste(DZ_DZIAL_ID,collapse = "|"),
         DZ_NAZWA = paste(DZ_NAZWA,collapse = "|"),
         redaktor_dzialu = paste(redaktor_dzialu,collapse = "|"),
         id = paste(id,collapse = "|")) %>%
  ungroup() %>%
  unique() %>%
  filter(grepl("\\|",unikatowy_dzial)) %>%
  select(-unikatowy_dzial)
if(nrow(kilka_literatur_nowego_tworcy)>0) {
  kilka_literatur_nowego_tworcy <- kilka_literatur_nowego_tworcy %>%
  mutate(id_grupy = 1:nrow(.)) %>%
  cSplit(.,c("id","DZ_DZIAL_ID","DZ_NAZWA","redaktor_dzialu"),sep = "|",direction = "long")

kilka_literatur_nowego_tworcy[,2:7][duplicated(kilka_literatur_nowego_tworcy$id_grupy),] <- NA
kilka_literatur_nowego_tworcy <- fill_(kilka_literatur_nowego_tworcy, names(kilka_literatur_nowego_tworcy))
#zaktualizowanie zbioru podmiotowych o ujednolicone działy dla nowych twórców
x <- 1:length(kilka_literatur_nowego_tworcy$id)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  bn_ok$DZ_DZIAL_ID[bn_ok$id==kilka_literatur_nowego_tworcy$id[i]] <- kilka_literatur_nowego_tworcy$DZ_DZIAL_ID[i]
  bn_ok$DZ_NAZWA[bn_ok$id==kilka_literatur_nowego_tworcy$id[i]] <- as.character(kilka_literatur_nowego_tworcy$DZ_NAZWA)[i]
  bn_ok$redaktor_dzialu[bn_ok$id==kilka_literatur_nowego_tworcy$id[i]] <- as.character(kilka_literatur_nowego_tworcy$redaktor_dzialu)[i]
}
}

#jeśli nie ma działu lub rodzaju zapisu, to wpisać id i nazwę do ustalenia
bn_ok <- bn_ok %>%
  mutate(DZ_DZIAL_ID =ifelse(is.na(DZ_DZIAL_ID),0,as.integer(DZ_DZIAL_ID)),
         DZ_NAZWA = ifelse(is.na(DZ_NAZWA),"-- do ustalenia --",as.character(DZ_NAZWA)),
         RZ_RODZAJ_ID =ifelse(is.na(RZ_RODZAJ_ID),0,as.integer(RZ_RODZAJ_ID)),
         RZ_NAZWA = ifelse(is.na(RZ_NAZWA),"-- do ustalenia --",as.character(RZ_NAZWA)))

#usunięcie nadwyżki z książek z działów IH
slowniki_jezykowe_zle <- bn_ok %>% 
  filter(DZ_NAZWA=="Słowniki językowe") %>% 
  filter(!grepl("słownik",X655,ignore.case = TRUE))

slowniki_biograficzne_zle <- bn_ok %>% 
  filter(DZ_NAZWA=="Słowniki biograficzne") %>% 
  filter(!(grepl("Słownik biograficzny|Biografia",X655)&(grepl("pisarz|litera|aktor|scenograf|nauczyciel|akademi|nauk|filolog|kryty|lit\\.",X655,ignore.case = TRUE)|grepl("pisarz|litera|aktor|scenograf|nauczyciel|akademi|nauk|filolog|kryty|lit\\.",X650,ignore.case = TRUE))))

bn_ok <- bn_ok %>%
  filter(ZA_UWAGI %notin% slowniki_jezykowe_zle$ZA_UWAGI) %>% 
  filter(ZA_UWAGI %notin% slowniki_biograficzne_zle$ZA_UWAGI)
chunk11 <- bn_ok
#bezpiecznik - sprawdź, czy rozkład jest niekontrowersyjny
#bez automatu
bn_ok <- chunk11
count <- as.data.frame(table(bn_ok$redaktor_dzialu,bn_ok$czy_automatycznie)) %>% 
  filter(Var2=="nie") %>% 
  arrange(-Freq)

#ile książek ma automat

count2 <- as.data.frame(table(bn_ok$czy_automatycznie))

#realne statystyki po podmiotowej
# test <- bn_ok %>%
#   left_join(out %>% select(rekord_BN,pracownik),by=c("ZA_UWAGI"="rekord_BN")) %>%
#   mutate(pracownik = ifelse(is.na(pracownik),as.character(redaktor_dzialu),as.character(pracownik)),
#          pracownik = str_replace(pracownik,"(^.*?)(\\_.*$)","\\1"))
# 
# count3 <- as.data.frame(table(test$pracownik)) %>%
#   arrange(-Freq)
# 
# count4 <- as.data.frame(table(test$pracownik,test$DZ_NAZWA)) %>%
#   filter(Var1=="EWA"&Freq>0) %>%
#   arrange(-Freq)
bn_ok <- chunk11
data <- bn_ok %>%
  filter(rodzaj_ksiazki=="podmiotowa") %>%
  mutate(redaktor_dzialu = paste(redaktor_dzialu,"_podm",sep = ""))

#uwolnienie kolumn z danymi z bn i przetworzenie do PBL
#1: za_uwagi, rz_nazwa, za_ro_rok, za_type, rz_rodzaj_id, tw_tworca_id, tw_nazwisko, tw_imie, dz_dzial_id, dz_nazwa, redaktor_dzialu
pola_pbl <- data %>%
  select(ZA_UWAGI, RZ_NAZWA, ZA_RO_ROK = rok, RZ_RODZAJ_ID, TW_TWORCA_ID, TW_NAZWISKO, TW_IMIE, DZ_DZIAL_ID, DZ_NAZWA, redaktor_dzialu) %>%
  mutate(ZA_TYPE = "KS")
#2: autor
BN_autor <- data %>%
  select(X100,X245,ZA_UWAGI)
#pole 100
marc_field_100 <- BN_autor %>%
  select(ZA_UWAGI,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(BN_autor$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
#pole 245
marc_field_245 <- BN_autor %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(BN_autor$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
if("$b" %in% colnames(marc_field_100)==TRUE) { 
BN_autor <- marc_field_100 %>%
 select(ZA_UWAGI,`$a`,`$b`) %>%
 unique() %>%
 mutate(`$a` = ifelse(!is.na(`$b`),paste(`$a`,`$b`,sep = " "),as.character(`$a`))) %>%
 mutate(`$a` = str_remove(`$a`,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)")) %>%
 unique() %>%
 mutate(AM_NAZWISKO = ifelse(grepl("\\|",`$a`), str_replace_all(str_remove_all(`$a`,","),"\\|",", "),
                             ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\1"),as.character(`$a`))),
        AM_IMIE = ifelse(grepl("\\|",`$a`),"*",
                         ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\3"),"*"))) %>%
 select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE) %>%
 left_join(.,marc_field_245,by="ZA_UWAGI") %>%
 select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE, X245c = `$c`)
} else {
  BN_autor <- marc_field_100 %>%
  select(ZA_UWAGI,`$a`) %>%
  unique() %>%
  mutate(`$a` = str_remove(`$a`,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)")) %>%
  unique() %>%
  mutate(AM_NAZWISKO = ifelse(grepl("\\|",`$a`), str_replace_all(str_remove_all(`$a`,","),"\\|",", "),
                             ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\1"),as.character(`$a`))),
        AM_IMIE = ifelse(grepl("\\|",`$a`),"*",
                         ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\3"),"*"))) %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE) %>%
  left_join(.,marc_field_245,by="ZA_UWAGI") %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE, X245c = `$c`)
}
  
x <- 1:lengths(BN_autor[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  BN_autor$czy_nazwisko[i] <- grepl(BN_autor$AM_NAZWISKO[i],BN_autor$X245c[i])
  BN_autor$czy_imie[i] <- grepl(BN_autor$AM_IMIE[i],BN_autor$X245c[i])
}
Progress:    1 on 8158  Progress:    2 on 8158  Progress:    3 on 8158  Progress:    4 on 8158  Progress:    5 on 8158  Progress:    6 on 8158  Progress:    7 on 8158  Progress:    8 on 8158  Progress:    9 on 8158  Progress:   10 on 8158  Progress:   11 on 8158  Progress:   12 on 8158  Progress:   13 on 8158  Progress:   14 on 8158  Progress:   15 on 8158  Progress:   16 on 8158  Progress:   17 on 8158  Progress:   18 on 8158  Progress:   19 on 8158  Progress:   20 on 8158  Progress:   21 on 8158  Progress:   22 on 8158  Progress:   23 on 8158  Progress:   24 on 8158  Progress:   25 on 8158  Progress:   26 on 8158  Progress:   27 on 8158  Progress:   28 on 8158  Progress:   29 on 8158  Progress:   30 on 8158  Progress:   31 on 8158  Progress:   32 on 8158  Progress:   33 on 8158  Progress:   34 on 8158  Progress:   35 on 8158  Progress:   36 on 8158  Progress:   37 on 8158  Progress:   38 on 8158  Progress:   39 on 8158  Progress:   40 on 8158  Progress:   41 on 8158  Progress:   42 on 8158  Progress:   43 on 8158  Progress:   44 on 8158  Progress:   45 on 8158  Progress:   46 on 8158  Progress:   47 on 8158  Progress:   48 on 8158  Progress:   49 on 8158  Progress:   50 on 8158  Progress:   51 on 8158  Progress:   52 on 8158  Progress:   53 on 8158  Progress:   54 on 8158  Progress:   55 on 8158  Progress:   56 on 8158  Progress:   57 on 8158  Progress:   58 on 8158  Progress:   59 on 8158  Progress:   60 on 8158  Progress:   61 on 8158  Progress:   62 on 8158  Progress:   63 on 8158  Progress:   64 on 8158  Progress:   65 on 8158  Progress:   66 on 8158  Progress:   67 on 8158  Progress:   68 on 8158  Progress:   69 on 8158  Progress:   70 on 8158  Progress:   71 on 8158  Progress:   72 on 8158  Progress:   73 on 8158  Progress:   74 on 8158  Progress:   75 on 8158  Progress:   76 on 8158  Progress:   77 on 8158  Progress:   78 on 8158  Progress:   79 on 8158  Progress:   80 on 8158  Progress:   81 on 8158  Progress:   82 on 8158  Progress:   83 on 8158  Progress:   84 on 8158  Progress:   85 on 8158  Progress:   86 on 8158  Progress:   87 on 8158  Progress:   88 on 8158  Progress:   89 on 8158  Progress:   90 on 8158  Progress:   91 on 8158  Progress:   92 on 8158  Progress:   93 on 8158  Progress:   94 on 8158  Progress:   95 on 8158  Progress:   96 on 8158  Progress:   97 on 8158  Progress:   98 on 8158  Progress:   99 on 8158  Progress:  100 on 8158  Progress:  101 on 8158  Progress:  102 on 8158  Progress:  103 on 8158  Progress:  104 on 8158  Progress:  105 on 8158  Progress:  106 on 8158  Progress:  107 on 8158  Progress:  108 on 8158  Progress:  109 on 8158  Progress:  110 on 8158  Progress:  111 on 8158  Progress:  112 on 8158  Progress:  113 on 8158  Progress:  114 on 8158  Progress:  115 on 8158  Progress:  116 on 8158  Progress:  117 on 8158  Progress:  118 on 8158  Progress:  119 on 8158  Progress:  120 on 8158  Progress:  121 on 8158  Progress:  122 on 8158  Progress:  123 on 8158  Progress:  124 on 8158  Progress:  125 on 8158  Progress:  126 on 8158  Progress:  127 on 8158  Progress:  128 on 8158  Progress:  129 on 8158  Progress:  130 on 8158  Progress:  131 on 8158  Progress:  132 on 8158  Progress:  133 on 8158  Progress:  134 on 8158  Progress:  135 on 8158  Progress:  136 on 8158  Progress:  137 on 8158  Progress:  138 on 8158  Progress:  139 on 8158  Progress:  140 on 8158  Progress:  141 on 8158  Progress:  142 on 8158  Progress:  143 on 8158  Progress:  144 on 8158  Progress:  145 on 8158  Progress:  146 on 8158  Progress:  147 on 8158  Progress:  148 on 8158  Progress:  149 on 8158  Progress:  150 on 8158  Progress:  151 on 8158  Progress:  152 on 8158  Progress:  153 on 8158  Progress:  154 on 8158  Progress:  155 on 8158  Progress:  156 on 8158  Progress:  157 on 8158  Progress:  158 on 8158  Progress:  159 on 8158  Progress:  160 on 8158  Progress:  161 on 8158  Progress:  162 on 8158  Progress:  163 on 8158  Progress:  164 on 8158  Progress:  165 on 8158  Progress:  166 on 8158  Progress:  167 on 8158  Progress:  168 on 8158  Progress:  169 on 8158  Progress:  170 on 8158  Progress:  171 on 8158  Progress:  172 on 8158  Progress:  173 on 8158  Progress:  174 on 8158  Progress:  175 on 8158  Progress:  176 on 8158  Progress:  177 on 8158  Progress:  178 on 8158  Progress:  179 on 8158  Progress:  180 on 8158  Progress:  181 on 8158  Progress:  182 on 8158  Progress:  183 on 8158  Progress:  184 on 8158  Progress:  185 on 8158  Progress:  186 on 8158  Progress:  187 on 8158  Progress:  188 on 8158  Progress:  189 on 8158  Progress:  190 on 8158  Progress:  191 on 8158  Progress:  192 on 8158  Progress:  193 on 8158  Progress:  194 on 8158  Progress:  195 on 8158  Progress:  196 on 8158  Progress:  197 on 8158  Progress:  198 on 8158  Progress:  199 on 8158  Progress:  200 on 8158  Progress:  201 on 8158  Progress:  202 on 8158  Progress:  203 on 8158  Progress:  204 on 8158  Progress:  205 on 8158  Progress:  206 on 8158  Progress:  207 on 8158  Progress:  208 on 8158  Progress:  209 on 8158  Progress:  210 on 8158  Progress:  211 on 8158  Progress:  212 on 8158  Progress:  213 on 8158  Progress:  214 on 8158  Progress:  215 on 8158  Progress:  216 on 8158  Progress:  217 on 8158  Progress:  218 on 8158  Progress:  219 on 8158  Progress:  220 on 8158  Progress:  221 on 8158  Progress:  222 on 8158  Progress:  223 on 8158  Progress:  224 on 8158  Progress:  225 on 8158  Progress:  226 on 8158  Progress:  227 on 8158  Progress:  228 on 8158  Progress:  229 on 8158  Progress:  230 on 8158  Progress:  231 on 8158  Progress:  232 on 8158  Progress:  233 on 8158  Progress:  234 on 8158  Progress:  235 on 8158  Progress:  236 on 8158  Progress:  237 on 8158  Progress:  238 on 8158  Progress:  239 on 8158  Progress:  240 on 8158  Progress:  241 on 8158  Progress:  242 on 8158  Progress:  243 on 8158  Progress:  244 on 8158  Progress:  245 on 8158  Progress:  246 on 8158  Progress:  247 on 8158  Progress:  248 on 8158  Progress:  249 on 8158  Progress:  250 on 8158  Progress:  251 on 8158  Progress:  252 on 8158  Progress:  253 on 8158  Progress:  254 on 8158  Progress:  255 on 8158  Progress:  256 on 8158  Progress:  257 on 8158  Progress:  258 on 8158  Progress:  259 on 8158  Progress:  260 on 8158  Progress:  261 on 8158  Progress:  262 on 8158  Progress:  263 on 8158  Progress:  264 on 8158  Progress:  265 on 8158  Progress:  266 on 8158  Progress:  267 on 8158  Progress:  268 on 8158  Progress:  269 on 8158  Progress:  270 on 8158  Progress:  271 on 8158  Progress:  272 on 8158  Progress:  273 on 8158  Progress:  274 on 8158  Progress:  275 on 8158  Progress:  276 on 8158  Progress:  277 on 8158  Progress:  278 on 8158  Progress:  279 on 8158  Progress:  280 on 8158  Progress:  281 on 8158  Progress:  282 on 8158  Progress:  283 on 8158  Progress:  284 on 8158  Progress:  285 on 8158  Progress:  286 on 8158  Progress:  287 on 8158  Progress:  288 on 8158  Progress:  289 on 8158  Progress:  290 on 8158  Progress:  291 on 8158  Progress:  292 on 8158  Progress:  293 on 8158  Progress:  294 on 8158  Progress:  295 on 8158  Progress:  296 on 8158  Progress:  297 on 8158  Progress:  298 on 8158  Progress:  299 on 8158  Progress:  300 on 8158  Progress:  301 on 8158  Progress:  302 on 8158  Progress:  303 on 8158  Progress:  304 on 8158  Progress:  305 on 8158  Progress:  306 on 8158  Progress:  307 on 8158  Progress:  308 on 8158  Progress:  309 on 8158  Progress:  310 on 8158  Progress:  311 on 8158  Progress:  312 on 8158  Progress:  313 on 8158  Progress:  314 on 8158  Progress:  315 on 8158  Progress:  316 on 8158  Progress:  317 on 8158  Progress:  318 on 8158  Progress:  319 on 8158  Progress:  320 on 8158  Progress:  321 on 8158  Progress:  322 on 8158  Progress:  323 on 8158  Progress:  324 on 8158  Progress:  325 on 8158  Progress:  326 on 8158  Progress:  327 on 8158  Progress:  328 on 8158  Progress:  329 on 8158  Progress:  330 on 8158  Progress:  331 on 8158  Progress:  332 on 8158  Progress:  333 on 8158  Progress:  334 on 8158  Progress:  335 on 8158  Progress:  336 on 8158  Progress:  337 on 8158  Progress:  338 on 8158  Progress:  339 on 8158  Progress:  340 on 8158  Progress:  341 on 8158  Progress:  342 on 8158  Progress:  343 on 8158  Progress:  344 on 8158  Progress:  345 on 8158  Progress:  346 on 8158  Progress:  347 on 8158  Progress:  348 on 8158  Progress:  349 on 8158  Progress:  350 on 8158  Progress:  351 on 8158  Progress:  352 on 8158  Progress:  353 on 8158  Progress:  354 on 8158  Progress:  355 on 8158  Progress:  356 on 8158  Progress:  357 on 8158  Progress:  358 on 8158  Progress:  359 on 8158  Progress:  360 on 8158  Progress:  361 on 8158  Progress:  362 on 8158  Progress:  363 on 8158  Progress:  364 on 8158  Progress:  365 on 8158  Progress:  366 on 8158  Progress:  367 on 8158  Progress:  368 on 8158  Progress:  369 on 8158  Progress:  370 on 8158  Progress:  371 on 8158  Progress:  372 on 8158  Progress:  373 on 8158  Progress:  374 on 8158  Progress:  375 on 8158  Progress:  376 on 8158  Progress:  377 on 8158  Progress:  378 on 8158  Progress:  379 on 8158  Progress:  380 on 8158  Progress:  381 on 8158  Progress:  382 on 8158  Progress:  383 on 8158  Progress:  384 on 8158  Progress:  385 on 8158  Progress:  386 on 8158  Progress:  387 on 8158  Progress:  388 on 8158  Progress:  389 on 8158  Progress:  390 on 8158  Progress:  391 on 8158  Progress:  392 on 8158  Progress:  393 on 8158  Progress:  394 on 8158  Progress:  395 on 8158  Progress:  396 on 8158  Progress:  397 on 8158  Progress:  398 on 8158  Progress:  399 on 8158  Progress:  400 on 8158  Progress:  401 on 8158  Progress:  402 on 8158  Progress:  403 on 8158  Progress:  404 on 8158  Progress:  405 on 8158  Progress:  406 on 8158  Progress:  407 on 8158  Progress:  408 on 8158  Progress:  409 on 8158  Progress:  410 on 8158  Progress:  411 on 8158  Progress:  412 on 8158  Progress:  413 on 8158  Progress:  414 on 8158  Progress:  415 on 8158  Progress:  416 on 8158  Progress:  417 on 8158  Progress:  418 on 8158  Progress:  419 on 8158  Progress:  420 on 8158  Progress:  421 on 8158  Progress:  422 on 8158  Progress:  423 on 8158  Progress:  424 on 8158  Progress:  425 on 8158  Progress:  426 on 8158  Progress:  427 on 8158  Progress:  428 on 8158  Progress:  429 on 8158  Progress:  430 on 8158  Progress:  431 on 8158  Progress:  432 on 8158  Progress:  433 on 8158  Progress:  434 on 8158  Progress:  435 on 8158  Progress:  436 on 8158  Progress:  437 on 8158  Progress:  438 on 8158  Progress:  439 on 8158  Progress:  440 on 8158  Progress:  441 on 8158  Progress:  442 on 8158  Progress:  443 on 8158  Progress:  444 on 8158  Progress:  445 on 8158  Progress:  446 on 8158  Progress:  447 on 8158  Progress:  448 on 8158  Progress:  449 on 8158  Progress:  450 on 8158  Progress:  451 on 8158  Progress:  452 on 8158  Progress:  453 on 8158  Progress:  454 on 8158  Progress:  455 on 8158  Progress:  456 on 8158  Progress:  457 on 8158  Progress:  458 on 8158  Progress:  459 on 8158  Progress:  460 on 8158  Progress:  461 on 8158  Progress:  462 on 8158  Progress:  463 on 8158  Progress:  464 on 8158  Progress:  465 on 8158  Progress:  466 on 8158  Progress:  467 on 8158  Progress:  468 on 8158  Progress:  469 on 8158  Progress:  470 on 8158  Progress:  471 on 8158  Progress:  472 on 8158  Progress:  473 on 8158  Progress:  474 on 8158  Progress:  475 on 8158  Progress:  476 on 8158  Progress:  477 on 8158  Progress:  478 on 8158  Progress:  479 on 8158  Progress:  480 on 8158  Progress:  481 on 8158  Progress:  482 on 8158  Progress:  483 on 8158  Progress:  484 on 8158  Progress:  485 on 8158  Progress:  486 on 8158  Progress:  487 on 8158  Progress:  488 on 8158  Progress:  489 on 8158  Progress:  490 on 8158  Progress:  491 on 8158  Progress:  492 on 8158  Progress:  493 on 8158  Progress:  494 on 8158  Progress:  495 on 8158  Progress:  496 on 8158  Progress:  497 on 8158  Progress:  498 on 8158  Progress:  499 on 8158  Progress:  500 on 8158  Progress:  501 on 8158  Progress:  502 on 8158  Progress:  503 on 8158  Progress:  504 on 8158  Progress:  505 on 8158  Progress:  506 on 8158  Progress:  507 on 8158  Progress:  508 on 8158  Progress:  509 on 8158  Progress:  510 on 8158  Progress:  511 on 8158  Progress:  512 on 8158  Progress:  513 on 8158  Progress:  514 on 8158  Progress:  515 on 8158  Progress:  516 on 8158  Progress:  517 on 8158  Progress:  518 on 8158  Progress:  519 on 8158  Progress:  520 on 8158  Progress:  521 on 8158  Progress:  522 on 8158  Progress:  523 on 8158  Progress:  524 on 8158  Progress:  525 on 8158  Progress:  526 on 8158  Progress:  527 on 8158  Progress:  528 on 8158  Progress:  529 on 8158  Progress:  530 on 8158  Progress:  531 on 8158  Progress:  532 on 8158  Progress:  533 on 8158  Progress:  534 on 8158  Progress:  535 on 8158  Progress:  536 on 8158  Progress:  537 on 8158  Progress:  538 on 8158  Progress:  539 on 8158  Progress:  540 on 8158  Progress:  541 on 8158  Progress:  542 on 8158  Progress:  543 on 8158  Progress:  544 on 8158  Progress:  545 on 8158  Progress:  546 on 8158  Progress:  547 on 8158  Progress:  548 on 8158  Progress:  549 on 8158  Progress:  550 on 8158  Progress:  551 on 8158  Progress:  552 on 8158  Progress:  553 on 8158  Progress:  554 on 8158  Progress:  555 on 8158  Progress:  556 on 8158  Progress:  557 on 8158  Progress:  558 on 8158  Progress:  559 on 8158  Progress:  560 on 8158  Progress:  561 on 8158  Progress:  562 on 8158  Progress:  563 on 8158  Progress:  564 on 8158  Progress:  565 on 8158  Progress:  566 on 8158  Progress:  567 on 8158  Progress:  568 on 8158  Progress:  569 on 8158  Progress:  570 on 8158  Progress:  571 on 8158  Progress:  572 on 8158  Progress:  573 on 8158  Progress:  574 on 8158  Progress:  575 on 8158  Progress:  576 on 8158  Progress:  577 on 8158  Progress:  578 on 8158  Progress:  579 on 8158  Progress:  580 on 8158  Progress:  581 on 8158  Progress:  582 on 8158  Progress:  583 on 8158  Progress:  584 on 8158  Progress:  585 on 8158  Progress:  586 on 8158  Progress:  587 on 8158  Progress:  588 on 8158  Progress:  589 on 8158  Progress:  590 on 8158  Progress:  591 on 8158  Progress:  592 on 8158  Progress:  593 on 8158  Progress:  594 on 8158  Progress:  595 on 8158  Progress:  596 on 8158  Progress:  597 on 8158  Progress:  598 on 8158  Progress:  599 on 8158  Progress:  600 on 8158  Progress:  601 on 8158  Progress:  602 on 8158  Progress:  603 on 8158  Progress:  604 on 8158  Progress:  605 on 8158  Progress:  606 on 8158  Progress:  607 on 8158  Progress:  608 on 8158  Progress:  609 on 8158  Progress:  610 on 8158  Progress:  611 on 8158  Progress:  612 on 8158  Progress:  613 on 8158  Progress:  614 on 8158  Progress:  615 on 8158  Progress:  616 on 8158  Progress:  617 on 8158  Progress:  618 on 8158  Progress:  619 on 8158  Progress:  620 on 8158  Progress:  621 on 8158  Progress:  622 on 8158  Progress:  623 on 8158  Progress:  624 on 8158  Progress:  625 on 8158  Progress:  626 on 8158  Progress:  627 on 8158  Progress:  628 on 8158  Progress:  629 on 8158  Progress:  630 on 8158  Progress:  631 on 8158  Progress:  632 on 8158  Progress:  633 on 8158  Progress:  634 on 8158  Progress:  635 on 8158  Progress:  636 on 8158  Progress:  637 on 8158  Progress:  638 on 8158  Progress:  639 on 8158  Progress:  640 on 8158  Progress:  641 on 8158  Progress:  642 on 8158  Progress:  643 on 8158  Progress:  644 on 8158  Progress:  645 on 8158  Progress:  646 on 8158  Progress:  647 on 8158  Progress:  648 on 8158  Progress:  649 on 8158  Progress:  650 on 8158  Progress:  651 on 8158  Progress:  652 on 8158  Progress:  653 on 8158  Progress:  654 on 8158  Progress:  655 on 8158  Progress:  656 on 8158  Progress:  657 on 8158  Progress:  658 on 8158  Progress:  659 on 8158  Progress:  660 on 8158  Progress:  661 on 8158  Progress:  662 on 8158  Progress:  663 on 8158  Progress:  664 on 8158  Progress:  665 on 8158  Progress:  666 on 8158  Progress:  667 on 8158  Progress:  668 on 8158  Progress:  669 on 8158  Progress:  670 on 8158  Progress:  671 on 8158  Progress:  672 on 8158  Progress:  673 on 8158  Progress:  674 on 8158  Progress:  675 on 8158  Progress:  676 on 8158  Progress:  677 on 8158  Progress:  678 on 8158  Progress:  679 on 8158  Progress:  680 on 8158  Progress:  681 on 8158  Progress:  682 on 8158  Progress:  683 on 8158  Progress:  684 on 8158  Progress:  685 on 8158  Progress:  686 on 8158  Progress:  687 on 8158  Progress:  688 on 8158  Progress:  689 on 8158  Progress:  690 on 8158  Progress:  691 on 8158  Progress:  692 on 8158  Progress:  693 on 8158  Progress:  694 on 8158  Progress:  695 on 8158  Progress:  696 on 8158  Progress:  697 on 8158  Progress:  698 on 8158  Progress:  699 on 8158  Progress:  700 on 8158  Progress:  701 on 8158  Progress:  702 on 8158  Progress:  703 on 8158  Progress:  704 on 8158  Progress:  705 on 8158  Progress:  706 on 8158  Progress:  707 on 8158  Progress:  708 on 8158  Progress:  709 on 8158  Progress:  710 on 8158  Progress:  711 on 8158  Progress:  712 on 8158  Progress:  713 on 8158  Progress:  714 on 8158  Progress:  715 on 8158  Progress:  716 on 8158  Progress:  717 on 8158  Progress:  718 on 8158  Progress:  719 on 8158  Progress:  720 on 8158  Progress:  721 on 8158  Progress:  722 on 8158  Progress:  723 on 8158  Progress:  724 on 8158  Progress:  725 on 8158  Progress:  726 on 8158  Progress:  727 on 8158  Progress:  728 on 8158  Progress:  729 on 8158  Progress:  730 on 8158  Progress:  731 on 8158  Progress:  732 on 8158  Progress:  733 on 8158  Progress:  734 on 8158  Progress:  735 on 8158  Progress:  736 on 8158  Progress:  737 on 8158  Progress:  738 on 8158  Progress:  739 on 8158  Progress:  740 on 8158  Progress:  741 on 8158  Progress:  742 on 8158  Progress:  743 on 8158  Progress:  744 on 8158  Progress:  745 on 8158  Progress:  746 on 8158  Progress:  747 on 8158  Progress:  748 on 8158  Progress:  749 on 8158  Progress:  750 on 8158  Progress:  751 on 8158  Progress:  752 on 8158  Progress:  753 on 8158  Progress:  754 on 8158  Progress:  755 on 8158  Progress:  756 on 8158  Progress:  757 on 8158  Progress:  758 on 8158  Progress:  759 on 8158  Progress:  760 on 8158  Progress:  761 on 8158  Progress:  762 on 8158  Progress:  763 on 8158  Progress:  764 on 8158  Progress:  765 on 8158  Progress:  766 on 8158  Progress:  767 on 8158  Progress:  768 on 8158  Progress:  769 on 8158  Progress:  770 on 8158  Progress:  771 on 8158  Progress:  772 on 8158  Progress:  773 on 8158  Progress:  774 on 8158  Progress:  775 on 8158  Progress:  776 on 8158  Progress:  777 on 8158  Progress:  778 on 8158  Progress:  779 on 8158  Progress:  780 on 8158  Progress:  781 on 8158  Progress:  782 on 8158  Progress:  783 on 8158  Progress:  784 on 8158  Progress:  785 on 8158  Progress:  786 on 8158  Progress:  787 on 8158  Progress:  788 on 8158  Progress:  789 on 8158  Progress:  790 on 8158  Progress:  791 on 8158  Progress:  792 on 8158  Progress:  793 on 8158  Progress:  794 on 8158  Progress:  795 on 8158  Progress:  796 on 8158  Progress:  797 on 8158  Progress:  798 on 8158  Progress:  799 on 8158  Progress:  800 on 8158  Progress:  801 on 8158  Progress:  802 on 8158  Progress:  803 on 8158  Progress:  804 on 8158  Progress:  805 on 8158  Progress:  806 on 8158  Progress:  807 on 8158  Progress:  808 on 8158  Progress:  809 on 8158  Progress:  810 on 8158  Progress:  811 on 8158  Progress:  812 on 8158  Progress:  813 on 8158  Progress:  814 on 8158  Progress:  815 on 8158  Progress:  816 on 8158  Progress:  817 on 8158  Progress:  818 on 8158  Progress:  819 on 8158  Progress:  820 on 8158  Progress:  821 on 8158  Progress:  822 on 8158  Progress:  823 on 8158  Progress:  824 on 8158  Progress:  825 on 8158  Progress:  826 on 8158  Progress:  827 on 8158  Progress:  828 on 8158  Progress:  829 on 8158  Progress:  830 on 8158  Progress:  831 on 8158  Progress:  832 on 8158  Progress:  833 on 8158  Progress:  834 on 8158  Progress:  835 on 8158  Progress:  836 on 8158  Progress:  837 on 8158  Progress:  838 on 8158  Progress:  839 on 8158  Progress:  840 on 8158  Progress:  841 on 8158  Progress:  842 on 8158  Progress:  843 on 8158  Progress:  844 on 8158  Progress:  845 on 8158  Progress:  846 on 8158  Progress:  847 on 8158  Progress:  848 on 8158  Progress:  849 on 8158  Progress:  850 on 8158  Progress:  851 on 8158  Progress:  852 on 8158  Progress:  853 on 8158  Progress:  854 on 8158  Progress:  855 on 8158  Progress:  856 on 8158  Progress:  857 on 8158  Progress:  858 on 8158  Progress:  859 on 8158  Progress:  860 on 8158  Progress:  861 on 8158  Progress:  862 on 8158  Progress:  863 on 8158  Progress:  864 on 8158  Progress:  865 on 8158  Progress:  866 on 8158  Progress:  867 on 8158  Progress:  868 on 8158  Progress:  869 on 8158  Progress:  870 on 8158  Progress:  871 on 8158  Progress:  872 on 8158  Progress:  873 on 8158  Progress:  874 on 8158  Progress:  875 on 8158  Progress:  876 on 8158  Progress:  877 on 8158  Progress:  878 on 8158  Progress:  879 on 8158  Progress:  880 on 8158  Progress:  881 on 8158  Progress:  882 on 8158  Progress:  883 on 8158  Progress:  884 on 8158  Progress:  885 on 8158  Progress:  886 on 8158  Progress:  887 on 8158  Progress:  888 on 8158  Progress:  889 on 8158  Progress:  890 on 8158  Progress:  891 on 8158  Progress:  892 on 8158  Progress:  893 on 8158  Progress:  894 on 8158  Progress:  895 on 8158  Progress:  896 on 8158  Progress:  897 on 8158  Progress:  898 on 8158  Progress:  899 on 8158  Progress:  900 on 8158  Progress:  901 on 8158  Progress:  902 on 8158  Progress:  903 on 8158  Progress:  904 on 8158  Progress:  905 on 8158  Progress:  906 on 8158  Progress:  907 on 8158  Progress:  908 on 8158  Progress:  909 on 8158  Progress:  910 on 8158  Progress:  911 on 8158  Progress:  912 on 8158  Progress:  913 on 8158  Progress:  914 on 8158  Progress:  915 on 8158  Progress:  916 on 8158  Progress:  917 on 8158  Progress:  918 on 8158  Progress:  919 on 8158  Progress:  920 on 8158  Progress:  921 on 8158  Progress:  922 on 8158  Progress:  923 on 8158  Progress:  924 on 8158  Progress:  925 on 8158  Progress:  926 on 8158  Progress:  927 on 8158  Progress:  928 on 8158  Progress:  929 on 8158  Progress:  930 on 8158  Progress:  931 on 8158  Progress:  932 on 8158  Progress:  933 on 8158  Progress:  934 on 8158  Progress:  935 on 8158  Progress:  936 on 8158  Progress:  937 on 8158  Progress:  938 on 8158  Progress:  939 on 8158  Progress:  940 on 8158  Progress:  941 on 8158  Progress:  942 on 8158  Progress:  943 on 8158  Progress:  944 on 8158  Progress:  945 on 8158  Progress:  946 on 8158  Progress:  947 on 8158  Progress:  948 on 8158  Progress:  949 on 8158  Progress:  950 on 8158  Progress:  951 on 8158  Progress:  952 on 8158  Progress:  953 on 8158  Progress:  954 on 8158  Progress:  955 on 8158  Progress:  956 on 8158  Progress:  957 on 8158  Progress:  958 on 8158  Progress:  959 on 8158  Progress:  960 on 8158  Progress:  961 on 8158  Progress:  962 on 8158  Progress:  963 on 8158  Progress:  964 on 8158  Progress:  965 on 8158  Progress:  966 on 8158  Progress:  967 on 8158  Progress:  968 on 8158  Progress:  969 on 8158  Progress:  970 on 8158  Progress:  971 on 8158  Progress:  972 on 8158  Progress:  973 on 8158  Progress:  974 on 8158  Progress:  975 on 8158  Progress:  976 on 8158  Progress:  977 on 8158  Progress:  978 on 8158  Progress:  979 on 8158  Progress:  980 on 8158  Progress:  981 on 8158  Progress:  982 on 8158  Progress:  983 on 8158  Progress:  984 on 8158  Progress:  985 on 8158  Progress:  986 on 8158  Progress:  987 on 8158  Progress:  988 on 8158  Progress:  989 on 8158  Progress:  990 on 8158  Progress:  991 on 8158  Progress:  992 on 8158  Progress:  993 on 8158  Progress:  994 on 8158  Progress:  995 on 8158  Progress:  996 on 8158  Progress:  997 on 8158  Progress:  998 on 8158  Progress:  999 on 8158  Progress: 1000 on 8158  Progress: 1001 on 8158  Progress: 1002 on 8158  Progress: 1003 on 8158  Progress: 1004 on 8158  Progress: 1005 on 8158  Progress: 1006 on 8158  Progress: 1007 on 8158  Progress: 1008 on 8158  Progress: 1009 on 8158  Progress: 1010 on 8158  Progress: 1011 on 8158  Progress: 1012 on 8158  Progress: 1013 on 8158  Progress: 1014 on 8158  Progress: 1015 on 8158  Progress: 1016 on 8158  Progress: 1017 on 8158  Progress: 1018 on 8158  Progress: 1019 on 8158  Progress: 1020 on 8158  Progress: 1021 on 8158  Progress: 1022 on 8158  Progress: 1023 on 8158  Progress: 1024 on 8158  Progress: 1025 on 8158  Progress: 1026 on 8158  Progress: 1027 on 8158  Progress: 1028 on 8158  Progress: 1029 on 8158  Progress: 1030 on 8158  Progress: 1031 on 8158  Progress: 1032 on 8158  Progress: 1033 on 8158  Progress: 1034 on 8158  Progress: 1035 on 8158  Progress: 1036 on 8158  Progress: 1037 on 8158  Progress: 1038 on 8158  Progress: 1039 on 8158  Progress: 1040 on 8158  Progress: 1041 on 8158  Progress: 1042 on 8158  Progress: 1043 on 8158  Progress: 1044 on 8158  Progress: 1045 on 8158  Progress: 1046 on 8158  Progress: 1047 on 8158  Progress: 1048 on 8158  Progress: 1049 on 8158  Progress: 1050 on 8158  Progress: 1051 on 8158  Progress: 1052 on 8158  Progress: 1053 on 8158  Progress: 1054 on 8158  Progress: 1055 on 8158  Progress: 1056 on 8158  Progress: 1057 on 8158  Progress: 1058 on 8158  Progress: 1059 on 8158  Progress: 1060 on 8158  Progress: 1061 on 8158  Progress: 1062 on 8158  Progress: 1063 on 8158  Progress: 1064 on 8158  Progress: 1065 on 8158  Progress: 1066 on 8158  Progress: 1067 on 8158  Progress: 1068 on 8158  Progress: 1069 on 8158  Progress: 1070 on 8158  Progress: 1071 on 8158  Progress: 1072 on 8158  Progress: 1073 on 8158  Progress: 1074 on 8158  Progress: 1075 on 8158  Progress: 1076 on 8158  Progress: 1077 on 8158  Progress: 1078 on 8158  Progress: 1079 on 8158  Progress: 1080 on 8158  Progress: 1081 on 8158  Progress: 1082 on 8158  Progress: 1083 on 8158  Progress: 1084 on 8158  Progress: 1085 on 8158  Progress: 1086 on 8158  Progress: 1087 on 8158  Progress: 1088 on 8158  Progress: 1089 on 8158  Progress: 1090 on 8158  Progress: 1091 on 8158  Progress: 1092 on 8158  Progress: 1093 on 8158  Progress: 1094 on 8158  Progress: 1095 on 8158  Progress: 1096 on 8158  Progress: 1097 on 8158  Progress: 1098 on 8158  Progress: 1099 on 8158  Progress: 1100 on 8158  Progress: 1101 on 8158  Progress: 1102 on 8158  Progress: 1103 on 8158  Progress: 1104 on 8158  Progress: 1105 on 8158  Progress: 1106 on 8158  Progress: 1107 on 8158  Progress: 1108 on 8158  Progress: 1109 on 8158  Progress: 1110 on 8158  Progress: 1111 on 8158  Progress: 1112 on 8158  Progress: 1113 on 8158  Progress: 1114 on 8158  Progress: 1115 on 8158  Progress: 1116 on 8158  Progress: 1117 on 8158  Progress: 1118 on 8158  Progress: 1119 on 8158  Progress: 1120 on 8158  Progress: 1121 on 8158  Progress: 1122 on 8158  Progress: 1123 on 8158  Progress: 1124 on 8158  Progress: 1125 on 8158  Progress: 1126 on 8158  Progress: 1127 on 8158  Progress: 1128 on 8158  Progress: 1129 on 8158  Progress: 1130 on 8158  Progress: 1131 on 8158  Progress: 1132 on 8158  Progress: 1133 on 8158  Progress: 1134 on 8158  Progress: 1135 on 8158  Progress: 1136 on 8158  Progress: 1137 on 8158  Progress: 1138 on 8158  Progress: 1139 on 8158  Progress: 1140 on 8158  Progress: 1141 on 8158  Progress: 1142 on 8158  Progress: 1143 on 8158  Progress: 1144 on 8158  Progress: 1145 on 8158  Progress: 1146 on 8158  Progress: 1147 on 8158  Progress: 1148 on 8158  Progress: 1149 on 8158  Progress: 1150 on 8158  Progress: 1151 on 8158  Progress: 1152 on 8158  Progress: 1153 on 8158  Progress: 1154 on 8158  Progress: 1155 on 8158  Progress: 1156 on 8158  Progress: 1157 on 8158  Progress: 1158 on 8158  Progress: 1159 on 8158  Progress: 1160 on 8158  Progress: 1161 on 8158  Progress: 1162 on 8158  Progress: 1163 on 8158  Progress: 1164 on 8158  Progress: 1165 on 8158  Progress: 1166 on 8158  Progress: 1167 on 8158  Progress: 1168 on 8158  Progress: 1169 on 8158  Progress: 1170 on 8158  Progress: 1171 on 8158  Progress: 1172 on 8158  Progress: 1173 on 8158  Progress: 1174 on 8158  Progress: 1175 on 8158  Progress: 1176 on 8158  Progress: 1177 on 8158  Progress: 1178 on 8158  Progress: 1179 on 8158  Progress: 1180 on 8158  Progress: 1181 on 8158  Progress: 1182 on 8158  Progress: 1183 on 8158  Progress: 1184 on 8158  Progress: 1185 on 8158  Progress: 1186 on 8158  Progress: 1187 on 8158  Progress: 1188 on 8158  Progress: 1189 on 8158  Progress: 1190 on 8158  Progress: 1191 on 8158  Progress: 1192 on 8158  Progress: 1193 on 8158  Progress: 1194 on 8158  Progress: 1195 on 8158  Progress: 1196 on 8158  Progress: 1197 on 8158  Progress: 1198 on 8158  Progress: 1199 on 8158  Progress: 1200 on 8158  Progress: 1201 on 8158  Progress: 1202 on 8158  Progress: 1203 on 8158  Progress: 1204 on 8158  Progress: 1205 on 8158  Progress: 1206 on 8158  Progress: 1207 on 8158  Progress: 1208 on 8158  Progress: 1209 on 8158  Progress: 1210 on 8158  Progress: 1211 on 8158  Progress: 1212 on 8158  Progress: 1213 on 8158  Progress: 1214 on 8158  Progress: 1215 on 8158  Progress: 1216 on 8158  Progress: 1217 on 8158  Progress: 1218 on 8158  Progress: 1219 on 8158  Progress: 1220 on 8158  Progress: 1221 on 8158  Progress: 1222 on 8158  Progress: 1223 on 8158  Progress: 1224 on 8158  Progress: 1225 on 8158  Progress: 1226 on 8158  Progress: 1227 on 8158  Progress: 1228 on 8158  Progress: 1229 on 8158  Progress: 1230 on 8158  Progress: 1231 on 8158  Progress: 1232 on 8158  Progress: 1233 on 8158  Progress: 1234 on 8158  Progress: 1235 on 8158  Progress: 1236 on 8158  Progress: 1237 on 8158  Progress: 1238 on 8158  Progress: 1239 on 8158  Progress: 1240 on 8158  Progress: 1241 on 8158  Progress: 1242 on 8158  Progress: 1243 on 8158  Progress: 1244 on 8158  Progress: 1245 on 8158  Progress: 1246 on 8158  Progress: 1247 on 8158  Progress: 1248 on 8158  Progress: 1249 on 8158  Progress: 1250 on 8158  Progress: 1251 on 8158  Progress: 1252 on 8158  Progress: 1253 on 8158  Progress: 1254 on 8158  Progress: 1255 on 8158  Progress: 1256 on 8158  Progress: 1257 on 8158  Progress: 1258 on 8158  Progress: 1259 on 8158  Progress: 1260 on 8158  Progress: 1261 on 8158  Progress: 1262 on 8158  Progress: 1263 on 8158  Progress: 1264 on 8158  Progress: 1265 on 8158  Progress: 1266 on 8158  Progress: 1267 on 8158  Progress: 1268 on 8158  Progress: 1269 on 8158  Progress: 1270 on 8158  Progress: 1271 on 8158  Progress: 1272 on 8158  Progress: 1273 on 8158  Progress: 1274 on 8158  Progress: 1275 on 8158  Progress: 1276 on 8158  Progress: 1277 on 8158  Progress: 1278 on 8158  Progress: 1279 on 8158  Progress: 1280 on 8158  Progress: 1281 on 8158  Progress: 1282 on 8158  Progress: 1283 on 8158  Progress: 1284 on 8158  Progress: 1285 on 8158  Progress: 1286 on 8158  Progress: 1287 on 8158  Progress: 1288 on 8158  Progress: 1289 on 8158  Progress: 1290 on 8158  Progress: 1291 on 8158  Progress: 1292 on 8158  Progress: 1293 on 8158  Progress: 1294 on 8158  Progress: 1295 on 8158  Progress: 1296 on 8158  Progress: 1297 on 8158  Progress: 1298 on 8158  Progress: 1299 on 8158  Progress: 1300 on 8158  Progress: 1301 on 8158  Progress: 1302 on 8158  Progress: 1303 on 8158  Progress: 1304 on 8158  Progress: 1305 on 8158  Progress: 1306 on 8158  Progress: 1307 on 8158  Progress: 1308 on 8158  Progress: 1309 on 8158  Progress: 1310 on 8158  Progress: 1311 on 8158  Progress: 1312 on 8158  Progress: 1313 on 8158  Progress: 1314 on 8158  Progress: 1315 on 8158  Progress: 1316 on 8158  Progress: 1317 on 8158  Progress: 1318 on 8158  Progress: 1319 on 8158  Progress: 1320 on 8158  Progress: 1321 on 8158  Progress: 1322 on 8158  Progress: 1323 on 8158  Progress: 1324 on 8158  Progress: 1325 on 8158  Progress: 1326 on 8158  Progress: 1327 on 8158  Progress: 1328 on 8158  Progress: 1329 on 8158  Progress: 1330 on 8158  Progress: 1331 on 8158  Progress: 1332 on 8158  Progress: 1333 on 8158  Progress: 1334 on 8158  Progress: 1335 on 8158  Progress: 1336 on 8158  Progress: 1337 on 8158  Progress: 1338 on 8158  Progress: 1339 on 8158  Progress: 1340 on 8158  Progress: 1341 on 8158  Progress: 1342 on 8158  Progress: 1343 on 8158  Progress: 1344 on 8158  Progress: 1345 on 8158  Progress: 1346 on 8158  Progress: 1347 on 8158  Progress: 1348 on 8158  Progress: 1349 on 8158  Progress: 1350 on 8158  Progress: 1351 on 8158  Progress: 1352 on 8158  Progress: 1353 on 8158  Progress: 1354 on 8158  Progress: 1355 on 8158  Progress: 1356 on 8158  Progress: 1357 on 8158  Progress: 1358 on 8158  Progress: 1359 on 8158  Progress: 1360 on 8158  Progress: 1361 on 8158  Progress: 1362 on 8158  Progress: 1363 on 8158  Progress: 1364 on 8158  Progress: 1365 on 8158  Progress: 1366 on 8158  Progress: 1367 on 8158  Progress: 1368 on 8158  Progress: 1369 on 8158  Progress: 1370 on 8158  Progress: 1371 on 8158  Progress: 1372 on 8158  Progress: 1373 on 8158  Progress: 1374 on 8158  Progress: 1375 on 8158  Progress: 1376 on 8158  Progress: 1377 on 8158  Progress: 1378 on 8158  Progress: 1379 on 8158  Progress: 1380 on 8158  Progress: 1381 on 8158  Progress: 1382 on 8158  Progress: 1383 on 8158  Progress: 1384 on 8158  Progress: 1385 on 8158  Progress: 1386 on 8158  Progress: 1387 on 8158  Progress: 1388 on 8158  Progress: 1389 on 8158  Progress: 1390 on 8158  Progress: 1391 on 8158  Progress: 1392 on 8158  Progress: 1393 on 8158  Progress: 1394 on 8158  Progress: 1395 on 8158  Progress: 1396 on 8158  Progress: 1397 on 8158  Progress: 1398 on 8158  Progress: 1399 on 8158  Progress: 1400 on 8158  Progress: 1401 on 8158  Progress: 1402 on 8158  Progress: 1403 on 8158  Progress: 1404 on 8158  Progress: 1405 on 8158  Progress: 1406 on 8158  Progress: 1407 on 8158  Progress: 1408 on 8158  Progress: 1409 on 8158  Progress: 1410 on 8158  Progress: 1411 on 8158  Progress: 1412 on 8158  Progress: 1413 on 8158  Progress: 1414 on 8158  Progress: 1415 on 8158  Progress: 1416 on 8158  Progress: 1417 on 8158  Progress: 1418 on 8158  Progress: 1419 on 8158  Progress: 1420 on 8158  Progress: 1421 on 8158  Progress: 1422 on 8158  Progress: 1423 on 8158  Progress: 1424 on 8158  Progress: 1425 on 8158  Progress: 1426 on 8158  Progress: 1427 on 8158  Progress: 1428 on 8158  Progress: 1429 on 8158  Progress: 1430 on 8158  Progress: 1431 on 8158  Progress: 1432 on 8158  Progress: 1433 on 8158  Progress: 1434 on 8158  Progress: 1435 on 8158  Progress: 1436 on 8158  Progress: 1437 on 8158  Progress: 1438 on 8158  Progress: 1439 on 8158  Progress: 1440 on 8158  Progress: 1441 on 8158  Progress: 1442 on 8158  Progress: 1443 on 8158  Progress: 1444 on 8158  Progress: 1445 on 8158  Progress: 1446 on 8158  Progress: 1447 on 8158  Progress: 1448 on 8158  Progress: 1449 on 8158  Progress: 1450 on 8158  Progress: 1451 on 8158  Progress: 1452 on 8158  Progress: 1453 on 8158  Progress: 1454 on 8158  Progress: 1455 on 8158  Progress: 1456 on 8158  Progress: 1457 on 8158  Progress: 1458 on 8158  Progress: 1459 on 8158  Progress: 1460 on 8158  Progress: 1461 on 8158  Progress: 1462 on 8158  Progress: 1463 on 8158  Progress: 1464 on 8158  Progress: 1465 on 8158  Progress: 1466 on 8158  Progress: 1467 on 8158  Progress: 1468 on 8158  Progress: 1469 on 8158  Progress: 1470 on 8158  Progress: 1471 on 8158  Progress: 1472 on 8158  Progress: 1473 on 8158  Progress: 1474 on 8158  Progress: 1475 on 8158  Progress: 1476 on 8158  Progress: 1477 on 8158  Progress: 1478 on 8158  Progress: 1479 on 8158  Progress: 1480 on 8158  Progress: 1481 on 8158  Progress: 1482 on 8158  Progress: 1483 on 8158  Progress: 1484 on 8158  Progress: 1485 on 8158  Progress: 1486 on 8158  Progress: 1487 on 8158  Progress: 1488 on 8158  Progress: 1489 on 8158  Progress: 1490 on 8158  Progress: 1491 on 8158  Progress: 1492 on 8158  Progress: 1493 on 8158  Progress: 1494 on 8158  Progress: 1495 on 8158  Progress: 1496 on 8158  Progress: 1497 on 8158  Progress: 1498 on 8158  Progress: 1499 on 8158  Progress: 1500 on 8158  Progress: 1501 on 8158  Progress: 1502 on 8158  Progress: 1503 on 8158  Progress: 1504 on 8158  Progress: 1505 on 8158  Progress: 1506 on 8158  Progress: 1507 on 8158  Progress: 1508 on 8158  Progress: 1509 on 8158  Progress: 1510 on 8158  Progress: 1511 on 8158  Progress: 1512 on 8158  Progress: 1513 on 8158  Progress: 1514 on 8158  Progress: 1515 on 8158  Progress: 1516 on 8158  Progress: 1517 on 8158  Progress: 1518 on 8158  Progress: 1519 on 8158  Progress: 1520 on 8158  Progress: 1521 on 8158  Progress: 1522 on 8158  Progress: 1523 on 8158  Progress: 1524 on 8158  Progress: 1525 on 8158  Progress: 1526 on 8158  Progress: 1527 on 8158  Progress: 1528 on 8158  Progress: 1529 on 8158  Progress: 1530 on 8158  Progress: 1531 on 8158  Progress: 1532 on 8158  Progress: 1533 on 8158  Progress: 1534 on 8158  Progress: 1535 on 8158  Progress: 1536 on 8158  Progress: 1537 on 8158  Progress: 1538 on 8158  Progress: 1539 on 8158  Progress: 1540 on 8158  Progress: 1541 on 8158  Progress: 1542 on 8158  Progress: 1543 on 8158  Progress: 1544 on 8158  Progress: 1545 on 8158  Progress: 1546 on 8158  Progress: 1547 on 8158  Progress: 1548 on 8158  Progress: 1549 on 8158  Progress: 1550 on 8158  Progress: 1551 on 8158  Progress: 1552 on 8158  Progress: 1553 on 8158  Progress: 1554 on 8158  Progress: 1555 on 8158  Progress: 1556 on 8158  Progress: 1557 on 8158  Progress: 1558 on 8158  Progress: 1559 on 8158  Progress: 1560 on 8158  Progress: 1561 on 8158  Progress: 1562 on 8158  Progress: 1563 on 8158  Progress: 1564 on 8158  Progress: 1565 on 8158  Progress: 1566 on 8158  Progress: 1567 on 8158  Progress: 1568 on 8158  Progress: 1569 on 8158  Progress: 1570 on 8158  Progress: 1571 on 8158  Progress: 1572 on 8158  Progress: 1573 on 8158  Progress: 1574 on 8158  Progress: 1575 on 8158  Progress: 1576 on 8158  Progress: 1577 on 8158  Progress: 1578 on 8158  Progress: 1579 on 8158  Progress: 1580 on 8158  Progress: 1581 on 8158  Progress: 1582 on 8158  Progress: 1583 on 8158  Progress: 1584 on 8158  Progress: 1585 on 8158  Progress: 1586 on 8158  Progress: 1587 on 8158  Progress: 1588 on 8158  Progress: 1589 on 8158  Progress: 1590 on 8158  Progress: 1591 on 8158  Progress: 1592 on 8158  Progress: 1593 on 8158  Progress: 1594 on 8158  Progress: 1595 on 8158  Progress: 1596 on 8158  Progress: 1597 on 8158  Progress: 1598 on 8158  Progress: 1599 on 8158  Progress: 1600 on 8158  Progress: 1601 on 8158  Progress: 1602 on 8158  Progress: 1603 on 8158  Progress: 1604 on 8158  Progress: 1605 on 8158  Progress: 1606 on 8158  Progress: 1607 on 8158  Progress: 1608 on 8158  Progress: 1609 on 8158  Progress: 1610 on 8158  Progress: 1611 on 8158  Progress: 1612 on 8158  Progress: 1613 on 8158  Progress: 1614 on 8158  Progress: 1615 on 8158  Progress: 1616 on 8158  Progress: 1617 on 8158  Progress: 1618 on 8158  Progress: 1619 on 8158  Progress: 1620 on 8158  Progress: 1621 on 8158  Progress: 1622 on 8158  Progress: 1623 on 8158  Progress: 1624 on 8158  Progress: 1625 on 8158  Progress: 1626 on 8158  Progress: 1627 on 8158  Progress: 1628 on 8158  Progress: 1629 on 8158  Progress: 1630 on 8158  Progress: 1631 on 8158  Progress: 1632 on 8158  Progress: 1633 on 8158  Progress: 1634 on 8158  Progress: 1635 on 8158  Progress: 1636 on 8158  Progress: 1637 on 8158  Progress: 1638 on 8158  Progress: 1639 on 8158  Progress: 1640 on 8158  Progress: 1641 on 8158  Progress: 1642 on 8158  Progress: 1643 on 8158  Progress: 1644 on 8158  Progress: 1645 on 8158  Progress: 1646 on 8158  Progress: 1647 on 8158  Progress: 1648 on 8158  Progress: 1649 on 8158  Progress: 1650 on 8158  Progress: 1651 on 8158  Progress: 1652 on 8158  Progress: 1653 on 8158  Progress: 1654 on 8158  Progress: 1655 on 8158  Progress: 1656 on 8158  Progress: 1657 on 8158  Progress: 1658 on 8158  Progress: 1659 on 8158  Progress: 1660 on 8158  Progress: 1661 on 8158  Progress: 1662 on 8158  Progress: 1663 on 8158  Progress: 1664 on 8158  Progress: 1665 on 8158  Progress: 1666 on 8158  Progress: 1667 on 8158  Progress: 1668 on 8158  Progress: 1669 on 8158  Progress: 1670 on 8158  Progress: 1671 on 8158  Progress: 1672 on 8158  Progress: 1673 on 8158  Progress: 1674 on 8158  Progress: 1675 on 8158  Progress: 1676 on 8158  Progress: 1677 on 8158  Progress: 1678 on 8158  Progress: 1679 on 8158  Progress: 1680 on 8158  Progress: 1681 on 8158  Progress: 1682 on 8158  Progress: 1683 on 8158  Progress: 1684 on 8158  Progress: 1685 on 8158  Progress: 1686 on 8158  Progress: 1687 on 8158  Progress: 1688 on 8158  Progress: 1689 on 8158  Progress: 1690 on 8158  Progress: 1691 on 8158  Progress: 1692 on 8158  Progress: 1693 on 8158  Progress: 1694 on 8158  Progress: 1695 on 8158  Progress: 1696 on 8158  Progress: 1697 on 8158  Progress: 1698 on 8158  Progress: 1699 on 8158  Progress: 1700 on 8158  Progress: 1701 on 8158  Progress: 1702 on 8158  Progress: 1703 on 8158  Progress: 1704 on 8158  Progress: 1705 on 8158  Progress: 1706 on 8158  Progress: 1707 on 8158  Progress: 1708 on 8158  Progress: 1709 on 8158  Progress: 1710 on 8158  Progress: 1711 on 8158  Progress: 1712 on 8158  Progress: 1713 on 8158  Progress: 1714 on 8158  Progress: 1715 on 8158  Progress: 1716 on 8158  Progress: 1717 on 8158  Progress: 1718 on 8158  Progress: 1719 on 8158  Progress: 1720 on 8158  Progress: 1721 on 8158  Progress: 1722 on 8158  Progress: 1723 on 8158  Progress: 1724 on 8158  Progress: 1725 on 8158  Progress: 1726 on 8158  Progress: 1727 on 8158  Progress: 1728 on 8158  Progress: 1729 on 8158  Progress: 1730 on 8158  Progress: 1731 on 8158  Progress: 1732 on 8158  Progress: 1733 on 8158  Progress: 1734 on 8158  Progress: 1735 on 8158  Progress: 1736 on 8158  Progress: 1737 on 8158  Progress: 1738 on 8158  Progress: 1739 on 8158  Progress: 1740 on 8158  Progress: 1741 on 8158  Progress: 1742 on 8158  Progress: 1743 on 8158  Progress: 1744 on 8158  Progress: 1745 on 8158  Progress: 1746 on 8158  Progress: 1747 on 8158  Progress: 1748 on 8158  Progress: 1749 on 8158  Progress: 1750 on 8158  Progress: 1751 on 8158  Progress: 1752 on 8158  Progress: 1753 on 8158  Progress: 1754 on 8158  Progress: 1755 on 8158  Progress: 1756 on 8158  Progress: 1757 on 8158  Progress: 1758 on 8158  Progress: 1759 on 8158  Progress: 1760 on 8158  Progress: 1761 on 8158  Progress: 1762 on 8158  Progress: 1763 on 8158  Progress: 1764 on 8158  Progress: 1765 on 8158  Progress: 1766 on 8158  Progress: 1767 on 8158  Progress: 1768 on 8158  Progress: 1769 on 8158  Progress: 1770 on 8158  Progress: 1771 on 8158  Progress: 1772 on 8158  Progress: 1773 on 8158  Progress: 1774 on 8158  Progress: 1775 on 8158  Progress: 1776 on 8158  Progress: 1777 on 8158  Progress: 1778 on 8158  Progress: 1779 on 8158  Progress: 1780 on 8158  Progress: 1781 on 8158  Progress: 1782 on 8158  Progress: 1783 on 8158  Progress: 1784 on 8158  Progress: 1785 on 8158  Progress: 1786 on 8158  Progress: 1787 on 8158  Progress: 1788 on 8158  Progress: 1789 on 8158  Progress: 1790 on 8158  Progress: 1791 on 8158  Progress: 1792 on 8158  Progress: 1793 on 8158  Progress: 1794 on 8158  Progress: 1795 on 8158  Progress: 1796 on 8158  Progress: 1797 on 8158  Progress: 1798 on 8158  Progress: 1799 on 8158  Progress: 1800 on 8158  Progress: 1801 on 8158  Progress: 1802 on 8158  Progress: 1803 on 8158  Progress: 1804 on 8158  Progress: 1805 on 8158  Progress: 1806 on 8158  Progress: 1807 on 8158  Progress: 1808 on 8158  Progress: 1809 on 8158  Progress: 1810 on 8158  Progress: 1811 on 8158  Progress: 1812 on 8158  Progress: 1813 on 8158  Progress: 1814 on 8158  Progress: 1815 on 8158  Progress: 1816 on 8158  Progress: 1817 on 8158  Progress: 1818 on 8158  Progress: 1819 on 8158  Progress: 1820 on 8158  Progress: 1821 on 8158  Progress: 1822 on 8158  Progress: 1823 on 8158  Progress: 1824 on 8158  Progress: 1825 on 8158  Progress: 1826 on 8158  Progress: 1827 on 8158  Progress: 1828 on 8158  Progress: 1829 on 8158  Progress: 1830 on 8158  Progress: 1831 on 8158  Progress: 1832 on 8158  Progress: 1833 on 8158  Progress: 1834 on 8158  Progress: 1835 on 8158  Progress: 1836 on 8158  Progress: 1837 on 8158  Progress: 1838 on 8158  Progress: 1839 on 8158  Progress: 1840 on 8158  Progress: 1841 on 8158  Progress: 1842 on 8158  Progress: 1843 on 8158  Progress: 1844 on 8158  Progress: 1845 on 8158  Progress: 1846 on 8158  Progress: 1847 on 8158  Progress: 1848 on 8158  Progress: 1849 on 8158  Progress: 1850 on 8158  Progress: 1851 on 8158  Progress: 1852 on 8158  Progress: 1853 on 8158  Progress: 1854 on 8158  Progress: 1855 on 8158  Progress: 1856 on 8158  Progress: 1857 on 8158  Progress: 1858 on 8158  Progress: 1859 on 8158  Progress: 1860 on 8158  Progress: 1861 on 8158  Progress: 1862 on 8158  Progress: 1863 on 8158  Progress: 1864 on 8158  Progress: 1865 on 8158  Progress: 1866 on 8158  Progress: 1867 on 8158  Progress: 1868 on 8158  Progress: 1869 on 8158  Progress: 1870 on 8158  Progress: 1871 on 8158  Progress: 1872 on 8158  Progress: 1873 on 8158  Progress: 1874 on 8158  Progress: 1875 on 8158  Progress: 1876 on 8158  Progress: 1877 on 8158  Progress: 1878 on 8158  Progress: 1879 on 8158  Progress: 1880 on 8158  Progress: 1881 on 8158  Progress: 1882 on 8158  Progress: 1883 on 8158  Progress: 1884 on 8158  Progress: 1885 on 8158  Progress: 1886 on 8158  Progress: 1887 on 8158  Progress: 1888 on 8158  Progress: 1889 on 8158  Progress: 1890 on 8158  Progress: 1891 on 8158  Progress: 1892 on 8158  Progress: 1893 on 8158  Progress: 1894 on 8158  Progress: 1895 on 8158  Progress: 1896 on 8158  Progress: 1897 on 8158  Progress: 1898 on 8158  Progress: 1899 on 8158  Progress: 1900 on 8158  Progress: 1901 on 8158  Progress: 1902 on 8158  Progress: 1903 on 8158  Progress: 1904 on 8158  Progress: 1905 on 8158  Progress: 1906 on 8158  Progress: 1907 on 8158  Progress: 1908 on 8158  Progress: 1909 on 8158  Progress: 1910 on 8158  Progress: 1911 on 8158  Progress: 1912 on 8158  Progress: 1913 on 8158  Progress: 1914 on 8158  Progress: 1915 on 8158  Progress: 1916 on 8158  Progress: 1917 on 8158  Progress: 1918 on 8158  Progress: 1919 on 8158  Progress: 1920 on 8158  Progress: 1921 on 8158  Progress: 1922 on 8158  Progress: 1923 on 8158  Progress: 1924 on 8158  Progress: 1925 on 8158  Progress: 1926 on 8158  Progress: 1927 on 8158  Progress: 1928 on 8158  Progress: 1929 on 8158  Progress: 1930 on 8158  Progress: 1931 on 8158  Progress: 1932 on 8158  Progress: 1933 on 8158  Progress: 1934 on 8158  Progress: 1935 on 8158  Progress: 1936 on 8158  Progress: 1937 on 8158  Progress: 1938 on 8158  Progress: 1939 on 8158  Progress: 1940 on 8158  Progress: 1941 on 8158  Progress: 1942 on 8158  Progress: 1943 on 8158  Progress: 1944 on 8158  Progress: 1945 on 8158  Progress: 1946 on 8158  Progress: 1947 on 8158  Progress: 1948 on 8158  Progress: 1949 on 8158  Progress: 1950 on 8158  Progress: 1951 on 8158  Progress: 1952 on 8158  Progress: 1953 on 8158  Progress: 1954 on 8158  Progress: 1955 on 8158  Progress: 1956 on 8158  Progress: 1957 on 8158  Progress: 1958 on 8158  Progress: 1959 on 8158  Progress: 1960 on 8158  Progress: 1961 on 8158  Progress: 1962 on 8158  Progress: 1963 on 8158  Progress: 1964 on 8158  Progress: 1965 on 8158  Progress: 1966 on 8158  Progress: 1967 on 8158  Progress: 1968 on 8158  Progress: 1969 on 8158  Progress: 1970 on 8158  Progress: 1971 on 8158  Progress: 1972 on 8158  Progress: 1973 on 8158  Progress: 1974 on 8158  Progress: 1975 on 8158  Progress: 1976 on 8158  Progress: 1977 on 8158  Progress: 1978 on 8158  Progress: 1979 on 8158  Progress: 1980 on 8158  Progress: 1981 on 8158  Progress: 1982 on 8158  Progress: 1983 on 8158  Progress: 1984 on 8158  Progress: 1985 on 8158  Progress: 1986 on 8158  Progress: 1987 on 8158  Progress: 1988 on 8158  Progress: 1989 on 8158  Progress: 1990 on 8158  Progress: 1991 on 8158  Progress: 1992 on 8158  Progress: 1993 on 8158  Progress: 1994 on 8158  Progress: 1995 on 8158  Progress: 1996 on 8158  Progress: 1997 on 8158  Progress: 1998 on 8158  Progress: 1999 on 8158  Progress: 2000 on 8158  Progress: 2001 on 8158  Progress: 2002 on 8158  Progress: 2003 on 8158  Progress: 2004 on 8158  Progress: 2005 on 8158  Progress: 2006 on 8158  Progress: 2007 on 8158  Progress: 2008 on 8158  Progress: 2009 on 8158  Progress: 2010 on 8158  Progress: 2011 on 8158  Progress: 2012 on 8158  Progress: 2013 on 8158  Progress: 2014 on 8158  Progress: 2015 on 8158  Progress: 2016 on 8158  Progress: 2017 on 8158  Progress: 2018 on 8158  Progress: 2019 on 8158  Progress: 2020 on 8158  Progress: 2021 on 8158  Progress: 2022 on 8158  Progress: 2023 on 8158  Progress: 2024 on 8158  Progress: 2025 on 8158  Progress: 2026 on 8158  Progress: 2027 on 8158  Progress: 2028 on 8158  Progress: 2029 on 8158  Progress: 2030 on 8158  Progress: 2031 on 8158  Progress: 2032 on 8158  Progress: 2033 on 8158  Progress: 2034 on 8158  Progress: 2035 on 8158  Progress: 2036 on 8158  Progress: 2037 on 8158  Progress: 2038 on 8158  Progress: 2039 on 8158  Progress: 2040 on 8158  Progress: 2041 on 8158  Progress: 2042 on 8158  Progress: 2043 on 8158  Progress: 2044 on 8158  Progress: 2045 on 8158  Progress: 2046 on 8158  Progress: 2047 on 8158  Progress: 2048 on 8158  Progress: 2049 on 8158  Progress: 2050 on 8158  Progress: 2051 on 8158  Progress: 2052 on 8158  Progress: 2053 on 8158  Progress: 2054 on 8158  Progress: 2055 on 8158  Progress: 2056 on 8158  Progress: 2057 on 8158  Progress: 2058 on 8158  Progress: 2059 on 8158  Progress: 2060 on 8158  Progress: 2061 on 8158  Progress: 2062 on 8158  Progress: 2063 on 8158  Progress: 2064 on 8158  Progress: 2065 on 8158  Progress: 2066 on 8158  Progress: 2067 on 8158  Progress: 2068 on 8158  Progress: 2069 on 8158  Progress: 2070 on 8158  Progress: 2071 on 8158  Progress: 2072 on 8158  Progress: 2073 on 8158  Progress: 2074 on 8158  Progress: 2075 on 8158  Progress: 2076 on 8158  Progress: 2077 on 8158  Progress: 2078 on 8158  Progress: 2079 on 8158  Progress: 2080 on 8158  Progress: 2081 on 8158  Progress: 2082 on 8158  Progress: 2083 on 8158  Progress: 2084 on 8158  Progress: 2085 on 8158  Progress: 2086 on 8158  Progress: 2087 on 8158  Progress: 2088 on 8158  Progress: 2089 on 8158  Progress: 2090 on 8158  Progress: 2091 on 8158  Progress: 2092 on 8158  Progress: 2093 on 8158  Progress: 2094 on 8158  Progress: 2095 on 8158  Progress: 2096 on 8158  Progress: 2097 on 8158  Progress: 2098 on 8158  Progress: 2099 on 8158  Progress: 2100 on 8158  Progress: 2101 on 8158  Progress: 2102 on 8158  Progress: 2103 on 8158  Progress: 2104 on 8158  Progress: 2105 on 8158  Progress: 2106 on 8158  Progress: 2107 on 8158  Progress: 2108 on 8158  Progress: 2109 on 8158  Progress: 2110 on 8158  Progress: 2111 on 8158  Progress: 2112 on 8158  Progress: 2113 on 8158  Progress: 2114 on 8158  Progress: 2115 on 8158  Progress: 2116 on 8158  Progress: 2117 on 8158  Progress: 2118 on 8158  Progress: 2119 on 8158  Progress: 2120 on 8158  Progress: 2121 on 8158  Progress: 2122 on 8158  Progress: 2123 on 8158  Progress: 2124 on 8158  Progress: 2125 on 8158  Progress: 2126 on 8158  Progress: 2127 on 8158  Progress: 2128 on 8158  Progress: 2129 on 8158  Progress: 2130 on 8158  Progress: 2131 on 8158  Progress: 2132 on 8158  Progress: 2133 on 8158  Progress: 2134 on 8158  Progress: 2135 on 8158  Progress: 2136 on 8158  Progress: 2137 on 8158  Progress: 2138 on 8158  Progress: 2139 on 8158  Progress: 2140 on 8158  Progress: 2141 on 8158  Progress: 2142 on 8158  Progress: 2143 on 8158  Progress: 2144 on 8158  Progress: 2145 on 8158  Progress: 2146 on 8158  Progress: 2147 on 8158  Progress: 2148 on 8158  Progress: 2149 on 8158  Progress: 2150 on 8158  Progress: 2151 on 8158  Progress: 2152 on 8158  Progress: 2153 on 8158  Progress: 2154 on 8158  Progress: 2155 on 8158  Progress: 2156 on 8158  Progress: 2157 on 8158  Progress: 2158 on 8158  Progress: 2159 on 8158  Progress: 2160 on 8158  Progress: 2161 on 8158  Progress: 2162 on 8158  Progress: 2163 on 8158  Progress: 2164 on 8158  Progress: 2165 on 8158  Progress: 2166 on 8158  Progress: 2167 on 8158  Progress: 2168 on 8158  Progress: 2169 on 8158  Progress: 2170 on 8158  Progress: 2171 on 8158  Progress: 2172 on 8158  Progress: 2173 on 8158  Progress: 2174 on 8158  Progress: 2175 on 8158  Progress: 2176 on 8158  Progress: 2177 on 8158  Progress: 2178 on 8158  Progress: 2179 on 8158  Progress: 2180 on 8158  Progress: 2181 on 8158  Progress: 2182 on 8158  Progress: 2183 on 8158  Progress: 2184 on 8158  Progress: 2185 on 8158  Progress: 2186 on 8158  Progress: 2187 on 8158  Progress: 2188 on 8158  Progress: 2189 on 8158  Progress: 2190 on 8158  Progress: 2191 on 8158  Progress: 2192 on 8158  Progress: 2193 on 8158  Progress: 2194 on 8158  Progress: 2195 on 8158  Progress: 2196 on 8158  Progress: 2197 on 8158  Progress: 2198 on 8158  Progress: 2199 on 8158  Progress: 2200 on 8158  Progress: 2201 on 8158  Progress: 2202 on 8158  Progress: 2203 on 8158  Progress: 2204 on 8158  Progress: 2205 on 8158  Progress: 2206 on 8158  Progress: 2207 on 8158  Progress: 2208 on 8158  Progress: 2209 on 8158  Progress: 2210 on 8158  Progress: 2211 on 8158  Progress: 2212 on 8158  Progress: 2213 on 8158  Progress: 2214 on 8158  Progress: 2215 on 8158  Progress: 2216 on 8158  Progress: 2217 on 8158  Progress: 2218 on 8158  Progress: 2219 on 8158  Progress: 2220 on 8158  Progress: 2221 on 8158  Progress: 2222 on 8158  Progress: 2223 on 8158  Progress: 2224 on 8158  Progress: 2225 on 8158  Progress: 2226 on 8158  Progress: 2227 on 8158  Progress: 2228 on 8158  Progress: 2229 on 8158  Progress: 2230 on 8158  Progress: 2231 on 8158  Progress: 2232 on 8158  Progress: 2233 on 8158  Progress: 2234 on 8158  Progress: 2235 on 8158  Progress: 2236 on 8158  Progress: 2237 on 8158  Progress: 2238 on 8158  Progress: 2239 on 8158  Progress: 2240 on 8158  Progress: 2241 on 8158  Progress: 2242 on 8158  Progress: 2243 on 8158  Progress: 2244 on 8158  Progress: 2245 on 8158  Progress: 2246 on 8158  Progress: 2247 on 8158  Progress: 2248 on 8158  Progress: 2249 on 8158  Progress: 2250 on 8158  Progress: 2251 on 8158  Progress: 2252 on 8158  Progress: 2253 on 8158  Progress: 2254 on 8158  Progress: 2255 on 8158  Progress: 2256 on 8158  Progress: 2257 on 8158  Progress: 2258 on 8158  Progress: 2259 on 8158  Progress: 2260 on 8158  Progress: 2261 on 8158  Progress: 2262 on 8158  Progress: 2263 on 8158  Progress: 2264 on 8158  Progress: 2265 on 8158  Progress: 2266 on 8158  Progress: 2267 on 8158  Progress: 2268 on 8158  Progress: 2269 on 8158  Progress: 2270 on 8158  Progress: 2271 on 8158  Progress: 2272 on 8158  Progress: 2273 on 8158  Progress: 2274 on 8158  Progress: 2275 on 8158  Progress: 2276 on 8158  Progress: 2277 on 8158  Progress: 2278 on 8158  Progress: 2279 on 8158  Progress: 2280 on 8158  Progress: 2281 on 8158  Progress: 2282 on 8158  Progress: 2283 on 8158  Progress: 2284 on 8158  Progress: 2285 on 8158  Progress: 2286 on 8158  Progress: 2287 on 8158  Progress: 2288 on 8158  Progress: 2289 on 8158  Progress: 2290 on 8158  Progress: 2291 on 8158  Progress: 2292 on 8158  Progress: 2293 on 8158  Progress: 2294 on 8158  Progress: 2295 on 8158  Progress: 2296 on 8158  Progress: 2297 on 8158  Progress: 2298 on 8158  Progress: 2299 on 8158  Progress: 2300 on 8158  Progress: 2301 on 8158  Progress: 2302 on 8158  Progress: 2303 on 8158  Progress: 2304 on 8158  Progress: 2305 on 8158  Progress: 2306 on 8158  Progress: 2307 on 8158  Progress: 2308 on 8158  Progress: 2309 on 8158  Progress: 2310 on 8158  Progress: 2311 on 8158  Progress: 2312 on 8158  Progress: 2313 on 8158  Progress: 2314 on 8158  Progress: 2315 on 8158  Progress: 2316 on 8158  Progress: 2317 on 8158  Progress: 2318 on 8158  Progress: 2319 on 8158  Progress: 2320 on 8158  Progress: 2321 on 8158  Progress: 2322 on 8158  Progress: 2323 on 8158  Progress: 2324 on 8158  Progress: 2325 on 8158  Progress: 2326 on 8158  Progress: 2327 on 8158  Progress: 2328 on 8158  Progress: 2329 on 8158  Progress: 2330 on 8158  Progress: 2331 on 8158  Progress: 2332 on 8158  Progress: 2333 on 8158  Progress: 2334 on 8158  Progress: 2335 on 8158  Progress: 2336 on 8158  Progress: 2337 on 8158  Progress: 2338 on 8158  Progress: 2339 on 8158  Progress: 2340 on 8158  Progress: 2341 on 8158  Progress: 2342 on 8158  Progress: 2343 on 8158  Progress: 2344 on 8158  Progress: 2345 on 8158  Progress: 2346 on 8158  Progress: 2347 on 8158  Progress: 2348 on 8158  Progress: 2349 on 8158  Progress: 2350 on 8158  Progress: 2351 on 8158  Progress: 2352 on 8158  Progress: 2353 on 8158  Progress: 2354 on 8158  Progress: 2355 on 8158  Progress: 2356 on 8158  Progress: 2357 on 8158  Progress: 2358 on 8158  Progress: 2359 on 8158  Progress: 2360 on 8158  Progress: 2361 on 8158  Progress: 2362 on 8158  Progress: 2363 on 8158  Progress: 2364 on 8158  Progress: 2365 on 8158  Progress: 2366 on 8158  Progress: 2367 on 8158  Progress: 2368 on 8158  Progress: 2369 on 8158  Progress: 2370 on 8158  Progress: 2371 on 8158  Progress: 2372 on 8158  Progress: 2373 on 8158  Progress: 2374 on 8158  Progress: 2375 on 8158  Progress: 2376 on 8158  Progress: 2377 on 8158  Progress: 2378 on 8158  Progress: 2379 on 8158  Progress: 2380 on 8158  Progress: 2381 on 8158  Progress: 2382 on 8158  Progress: 2383 on 8158  Progress: 2384 on 8158  Progress: 2385 on 8158  Progress: 2386 on 8158  Progress: 2387 on 8158  Progress: 2388 on 8158  Progress: 2389 on 8158  Progress: 2390 on 8158  Progress: 2391 on 8158  Progress: 2392 on 8158  Progress: 2393 on 8158  Progress: 2394 on 8158  Progress: 2395 on 8158  Progress: 2396 on 8158  Progress: 2397 on 8158  Progress: 2398 on 8158  Progress: 2399 on 8158  Progress: 2400 on 8158  Progress: 2401 on 8158  Progress: 2402 on 8158  Progress: 2403 on 8158  Progress: 2404 on 8158  Progress: 2405 on 8158  Progress: 2406 on 8158  Progress: 2407 on 8158  Progress: 2408 on 8158  Progress: 2409 on 8158  Progress: 2410 on 8158  Progress: 2411 on 8158  Progress: 2412 on 8158  Progress: 2413 on 8158  Progress: 2414 on 8158  Progress: 2415 on 8158  Progress: 2416 on 8158  Progress: 2417 on 8158  Progress: 2418 on 8158  Progress: 2419 on 8158  Progress: 2420 on 8158  Progress: 2421 on 8158  Progress: 2422 on 8158  Progress: 2423 on 8158  Progress: 2424 on 8158  Progress: 2425 on 8158  Progress: 2426 on 8158  Progress: 2427 on 8158  Progress: 2428 on 8158  Progress: 2429 on 8158  Progress: 2430 on 8158  Progress: 2431 on 8158  Progress: 2432 on 8158  Progress: 2433 on 8158  Progress: 2434 on 8158  Progress: 2435 on 8158  Progress: 2436 on 8158  Progress: 2437 on 8158  Progress: 2438 on 8158  Progress: 2439 on 8158  Progress: 2440 on 8158  Progress: 2441 on 8158  Progress: 2442 on 8158  Progress: 2443 on 8158  Progress: 2444 on 8158  Progress: 2445 on 8158  Progress: 2446 on 8158  Progress: 2447 on 8158  Progress: 2448 on 8158  Progress: 2449 on 8158  Progress: 2450 on 8158  Progress: 2451 on 8158  Progress: 2452 on 8158  Progress: 2453 on 8158  Progress: 2454 on 8158  Progress: 2455 on 8158  Progress: 2456 on 8158  Progress: 2457 on 8158  Progress: 2458 on 8158  Progress: 2459 on 8158  Progress: 2460 on 8158  Progress: 2461 on 8158  Progress: 2462 on 8158  Progress: 2463 on 8158  Progress: 2464 on 8158  Progress: 2465 on 8158  Progress: 2466 on 8158  Progress: 2467 on 8158  Progress: 2468 on 8158  Progress: 2469 on 8158  Progress: 2470 on 8158  Progress: 2471 on 8158  Progress: 2472 on 8158  Progress: 2473 on 8158  Progress: 2474 on 8158  Progress: 2475 on 8158  Progress: 2476 on 8158  Progress: 2477 on 8158  Progress: 2478 on 8158  Progress: 2479 on 8158  Progress: 2480 on 8158  Progress: 2481 on 8158  Progress: 2482 on 8158  Progress: 2483 on 8158  Progress: 2484 on 8158  Progress: 2485 on 8158  Progress: 2486 on 8158  Progress: 2487 on 8158  Progress: 2488 on 8158  Progress: 2489 on 8158  Progress: 2490 on 8158  Progress: 2491 on 8158  Progress: 2492 on 8158  Progress: 2493 on 8158  Progress: 2494 on 8158  Progress: 2495 on 8158  Progress: 2496 on 8158  Progress: 2497 on 8158  Progress: 2498 on 8158  Progress: 2499 on 8158  Progress: 2500 on 8158  Progress: 2501 on 8158  Progress: 2502 on 8158  Progress: 2503 on 8158  Progress: 2504 on 8158  Progress: 2505 on 8158  Progress: 2506 on 8158  Progress: 2507 on 8158  Progress: 2508 on 8158  Progress: 2509 on 8158  Progress: 2510 on 8158  Progress: 2511 on 8158  Progress: 2512 on 8158  Progress: 2513 on 8158  Progress: 2514 on 8158  Progress: 2515 on 8158  Progress: 2516 on 8158  Progress: 2517 on 8158  Progress: 2518 on 8158  Progress: 2519 on 8158  Progress: 2520 on 8158  Progress: 2521 on 8158  Progress: 2522 on 8158  Progress: 2523 on 8158  Progress: 2524 on 8158  Progress: 2525 on 8158  Progress: 2526 on 8158  Progress: 2527 on 8158  Progress: 2528 on 8158  Progress: 2529 on 8158  Progress: 2530 on 8158  Progress: 2531 on 8158  Progress: 2532 on 8158  Progress: 2533 on 8158  Progress: 2534 on 8158  Progress: 2535 on 8158  Progress: 2536 on 8158  Progress: 2537 on 8158  Progress: 2538 on 8158  Progress: 2539 on 8158  Progress: 2540 on 8158  Progress: 2541 on 8158  Progress: 2542 on 8158  Progress: 2543 on 8158  Progress: 2544 on 8158  Progress: 2545 on 8158  Progress: 2546 on 8158  Progress: 2547 on 8158  Progress: 2548 on 8158  Progress: 2549 on 8158  Progress: 2550 on 8158  Progress: 2551 on 8158  Progress: 2552 on 8158  Progress: 2553 on 8158  Progress: 2554 on 8158  Progress: 2555 on 8158  Progress: 2556 on 8158  Progress: 2557 on 8158  Progress: 2558 on 8158  Progress: 2559 on 8158  Progress: 2560 on 8158  Progress: 2561 on 8158  Progress: 2562 on 8158  Progress: 2563 on 8158  Progress: 2564 on 8158  Progress: 2565 on 8158  Progress: 2566 on 8158  Progress: 2567 on 8158  Progress: 2568 on 8158  Progress: 2569 on 8158  Progress: 2570 on 8158  Progress: 2571 on 8158  Progress: 2572 on 8158  Progress: 2573 on 8158  Progress: 2574 on 8158  Progress: 2575 on 8158  Progress: 2576 on 8158  Progress: 2577 on 8158  Progress: 2578 on 8158  Progress: 2579 on 8158  Progress: 2580 on 8158  Progress: 2581 on 8158  Progress: 2582 on 8158  Progress: 2583 on 8158  Progress: 2584 on 8158  Progress: 2585 on 8158  Progress: 2586 on 8158  Progress: 2587 on 8158  Progress: 2588 on 8158  Progress: 2589 on 8158  Progress: 2590 on 8158  Progress: 2591 on 8158  Progress: 2592 on 8158  Progress: 2593 on 8158  Progress: 2594 on 8158  Progress: 2595 on 8158  Progress: 2596 on 8158  Progress: 2597 on 8158  Progress: 2598 on 8158  Progress: 2599 on 8158  Progress: 2600 on 8158  Progress: 2601 on 8158  Progress: 2602 on 8158  Progress: 2603 on 8158  Progress: 2604 on 8158  Progress: 2605 on 8158  Progress: 2606 on 8158  Progress: 2607 on 8158  Progress: 2608 on 8158  Progress: 2609 on 8158  Progress: 2610 on 8158  Progress: 2611 on 8158  Progress: 2612 on 8158  Progress: 2613 on 8158  Progress: 2614 on 8158  Progress: 2615 on 8158  Progress: 2616 on 8158  Progress: 2617 on 8158  Progress: 2618 on 8158  Progress: 2619 on 8158  Progress: 2620 on 8158  Progress: 2621 on 8158  Progress: 2622 on 8158  Progress: 2623 on 8158  Progress: 2624 on 8158  Progress: 2625 on 8158  Progress: 2626 on 8158  Progress: 2627 on 8158  Progress: 2628 on 8158  Progress: 2629 on 8158  Progress: 2630 on 8158  Progress: 2631 on 8158  Progress: 2632 on 8158  Progress: 2633 on 8158  Progress: 2634 on 8158  Progress: 2635 on 8158  Progress: 2636 on 8158  Progress: 2637 on 8158  Progress: 2638 on 8158  Progress: 2639 on 8158  Progress: 2640 on 8158  Progress: 2641 on 8158  Progress: 2642 on 8158  Progress: 2643 on 8158  Progress: 2644 on 8158  Progress: 2645 on 8158  Progress: 2646 on 8158  Progress: 2647 on 8158  Progress: 2648 on 8158  Progress: 2649 on 8158  Progress: 2650 on 8158  Progress: 2651 on 8158  Progress: 2652 on 8158  Progress: 2653 on 8158  Progress: 2654 on 8158  Progress: 2655 on 8158  Progress: 2656 on 8158  Progress: 2657 on 8158  Progress: 2658 on 8158  Progress: 2659 on 8158  Progress: 2660 on 8158  Progress: 2661 on 8158  Progress: 2662 on 8158  Progress: 2663 on 8158  Progress: 2664 on 8158  Progress: 2665 on 8158  Progress: 2666 on 8158  Progress: 2667 on 8158  Progress: 2668 on 8158  Progress: 2669 on 8158  Progress: 2670 on 8158  Progress: 2671 on 8158  Progress: 2672 on 8158  Progress: 2673 on 8158  Progress: 2674 on 8158  Progress: 2675 on 8158  Progress: 2676 on 8158  Progress: 2677 on 8158  Progress: 2678 on 8158  Progress: 2679 on 8158  Progress: 2680 on 8158  Progress: 2681 on 8158  Progress: 2682 on 8158  Progress: 2683 on 8158  Progress: 2684 on 8158  Progress: 2685 on 8158  Progress: 2686 on 8158  Progress: 2687 on 8158  Progress: 2688 on 8158  Progress: 2689 on 8158  Progress: 2690 on 8158  Progress: 2691 on 8158  Progress: 2692 on 8158  Progress: 2693 on 8158  Progress: 2694 on 8158  Progress: 2695 on 8158  Progress: 2696 on 8158  Progress: 2697 on 8158  Progress: 2698 on 8158  Progress: 2699 on 8158  Progress: 2700 on 8158  Progress: 2701 on 8158  Progress: 2702 on 8158  Progress: 2703 on 8158  Progress: 2704 on 8158  Progress: 2705 on 8158  Progress: 2706 on 8158  Progress: 2707 on 8158  Progress: 2708 on 8158  Progress: 2709 on 8158  Progress: 2710 on 8158  Progress: 2711 on 8158  Progress: 2712 on 8158  Progress: 2713 on 8158  Progress: 2714 on 8158  Progress: 2715 on 8158  Progress: 2716 on 8158  Progress: 2717 on 8158  Progress: 2718 on 8158  Progress: 2719 on 8158  Progress: 2720 on 8158  Progress: 2721 on 8158  Progress: 2722 on 8158  Progress: 2723 on 8158  Progress: 2724 on 8158  Progress: 2725 on 8158  Progress: 2726 on 8158  Progress: 2727 on 8158  Progress: 2728 on 8158  Progress: 2729 on 8158  Progress: 2730 on 8158  Progress: 2731 on 8158  Progress: 2732 on 8158  Progress: 2733 on 8158  Progress: 2734 on 8158  Progress: 2735 on 8158  Progress: 2736 on 8158  Progress: 2737 on 8158  Progress: 2738 on 8158  Progress: 2739 on 8158  Progress: 2740 on 8158  Progress: 2741 on 8158  Progress: 2742 on 8158  Progress: 2743 on 8158  Progress: 2744 on 8158  Progress: 2745 on 8158  Progress: 2746 on 8158  Progress: 2747 on 8158  Progress: 2748 on 8158  Progress: 2749 on 8158  Progress: 2750 on 8158  Progress: 2751 on 8158  Progress: 2752 on 8158  Progress: 2753 on 8158  Progress: 2754 on 8158  Progress: 2755 on 8158  Progress: 2756 on 8158  Progress: 2757 on 8158  Progress: 2758 on 8158  Progress: 2759 on 8158  Progress: 2760 on 8158  Progress: 2761 on 8158  Progress: 2762 on 8158  Progress: 2763 on 8158  Progress: 2764 on 8158  Progress: 2765 on 8158  Progress: 2766 on 8158  Progress: 2767 on 8158  Progress: 2768 on 8158  Progress: 2769 on 8158  Progress: 2770 on 8158  Progress: 2771 on 8158  Progress: 2772 on 8158  Progress: 2773 on 8158  Progress: 2774 on 8158  Progress: 2775 on 8158  Progress: 2776 on 8158  Progress: 2777 on 8158  Progress: 2778 on 8158  Progress: 2779 on 8158  Progress: 2780 on 8158  Progress: 2781 on 8158  Progress: 2782 on 8158  Progress: 2783 on 8158  Progress: 2784 on 8158  Progress: 2785 on 8158  Progress: 2786 on 8158  Progress: 2787 on 8158  Progress: 2788 on 8158  Progress: 2789 on 8158  Progress: 2790 on 8158  Progress: 2791 on 8158  Progress: 2792 on 8158  Progress: 2793 on 8158  Progress: 2794 on 8158  Progress: 2795 on 8158  Progress: 2796 on 8158  Progress: 2797 on 8158  Progress: 2798 on 8158  Progress: 2799 on 8158  Progress: 2800 on 8158  Progress: 2801 on 8158  Progress: 2802 on 8158  Progress: 2803 on 8158  Progress: 2804 on 8158  Progress: 2805 on 8158  Progress: 2806 on 8158  Progress: 2807 on 8158  Progress: 2808 on 8158  Progress: 2809 on 8158  Progress: 2810 on 8158  Progress: 2811 on 8158  Progress: 2812 on 8158  Progress: 2813 on 8158  Progress: 2814 on 8158  Progress: 2815 on 8158  Progress: 2816 on 8158  Progress: 2817 on 8158  Progress: 2818 on 8158  Progress: 2819 on 8158  Progress: 2820 on 8158  Progress: 2821 on 8158  Progress: 2822 on 8158  Progress: 2823 on 8158  Progress: 2824 on 8158  Progress: 2825 on 8158  Progress: 2826 on 8158  Progress: 2827 on 8158  Progress: 2828 on 8158  Progress: 2829 on 8158  Progress: 2830 on 8158  Progress: 2831 on 8158  Progress: 2832 on 8158  Progress: 2833 on 8158  Progress: 2834 on 8158  Progress: 2835 on 8158  Progress: 2836 on 8158  Progress: 2837 on 8158  Progress: 2838 on 8158  Progress: 2839 on 8158  Progress: 2840 on 8158  Progress: 2841 on 8158  Progress: 2842 on 8158  Progress: 2843 on 8158  Progress: 2844 on 8158  Progress: 2845 on 8158  Progress: 2846 on 8158  Progress: 2847 on 8158  Progress: 2848 on 8158  Progress: 2849 on 8158  Progress: 2850 on 8158  Progress: 2851 on 8158  Progress: 2852 on 8158  Progress: 2853 on 8158  Progress: 2854 on 8158  Progress: 2855 on 8158  Progress: 2856 on 8158  Progress: 2857 on 8158  Progress: 2858 on 8158  Progress: 2859 on 8158  Progress: 2860 on 8158  Progress: 2861 on 8158  Progress: 2862 on 8158  Progress: 2863 on 8158  Progress: 2864 on 8158  Progress: 2865 on 8158  Progress: 2866 on 8158  Progress: 2867 on 8158  Progress: 2868 on 8158  Progress: 2869 on 8158  Progress: 2870 on 8158  Progress: 2871 on 8158  Progress: 2872 on 8158  Progress: 2873 on 8158  Progress: 2874 on 8158  Progress: 2875 on 8158  Progress: 2876 on 8158  Progress: 2877 on 8158  Progress: 2878 on 8158  Progress: 2879 on 8158  Progress: 2880 on 8158  Progress: 2881 on 8158  Progress: 2882 on 8158  Progress: 2883 on 8158  Progress: 2884 on 8158  Progress: 2885 on 8158  Progress: 2886 on 8158  Progress: 2887 on 8158  Progress: 2888 on 8158  Progress: 2889 on 8158  Progress: 2890 on 8158  Progress: 2891 on 8158  Progress: 2892 on 8158  Progress: 2893 on 8158  Progress: 2894 on 8158  Progress: 2895 on 8158  Progress: 2896 on 8158  Progress: 2897 on 8158  Progress: 2898 on 8158  Progress: 2899 on 8158  Progress: 2900 on 8158  Progress: 2901 on 8158  Progress: 2902 on 8158  Progress: 2903 on 8158  Progress: 2904 on 8158  Progress: 2905 on 8158  Progress: 2906 on 8158  Progress: 2907 on 8158  Progress: 2908 on 8158  Progress: 2909 on 8158  Progress: 2910 on 8158  Progress: 2911 on 8158  Progress: 2912 on 8158  Progress: 2913 on 8158  Progress: 2914 on 8158  Progress: 2915 on 8158  Progress: 2916 on 8158  Progress: 2917 on 8158  Progress: 2918 on 8158  Progress: 2919 on 8158  Progress: 2920 on 8158  Progress: 2921 on 8158  Progress: 2922 on 8158  Progress: 2923 on 8158  Progress: 2924 on 8158  Progress: 2925 on 8158  Progress: 2926 on 8158  Progress: 2927 on 8158  Progress: 2928 on 8158  Progress: 2929 on 8158  Progress: 2930 on 8158  Progress: 2931 on 8158  Progress: 2932 on 8158  Progress: 2933 on 8158  Progress: 2934 on 8158  Progress: 2935 on 8158  Progress: 2936 on 8158  Progress: 2937 on 8158  Progress: 2938 on 8158  Progress: 2939 on 8158  Progress: 2940 on 8158  Progress: 2941 on 8158  Progress: 2942 on 8158  Progress: 2943 on 8158  Progress: 2944 on 8158  Progress: 2945 on 8158  Progress: 2946 on 8158  Progress: 2947 on 8158  Progress: 2948 on 8158  Progress: 2949 on 8158  Progress: 2950 on 8158  Progress: 2951 on 8158  Progress: 2952 on 8158  Progress: 2953 on 8158  Progress: 2954 on 8158  Progress: 2955 on 8158  Progress: 2956 on 8158  Progress: 2957 on 8158  Progress: 2958 on 8158  Progress: 2959 on 8158  Progress: 2960 on 8158  Progress: 2961 on 8158  Progress: 2962 on 8158  Progress: 2963 on 8158  Progress: 2964 on 8158  Progress: 2965 on 8158  Progress: 2966 on 8158  Progress: 2967 on 8158  Progress: 2968 on 8158  Progress: 2969 on 8158  Progress: 2970 on 8158  Progress: 2971 on 8158  Progress: 2972 on 8158  Progress: 2973 on 8158  Progress: 2974 on 8158  Progress: 2975 on 8158  Progress: 2976 on 8158  Progress: 2977 on 8158  Progress: 2978 on 8158  Progress: 2979 on 8158  Progress: 2980 on 8158  Progress: 2981 on 8158  Progress: 2982 on 8158  Progress: 2983 on 8158  Progress: 2984 on 8158  Progress: 2985 on 8158  Progress: 2986 on 8158  Progress: 2987 on 8158  Progress: 2988 on 8158  Progress: 2989 on 8158  Progress: 2990 on 8158  Progress: 2991 on 8158  Progress: 2992 on 8158  Progress: 2993 on 8158  Progress: 2994 on 8158  Progress: 2995 on 8158  Progress: 2996 on 8158  Progress: 2997 on 8158  Progress: 2998 on 8158  Progress: 2999 on 8158  Progress: 3000 on 8158  Progress: 3001 on 8158  Progress: 3002 on 8158  Progress: 3003 on 8158  Progress: 3004 on 8158  Progress: 3005 on 8158  Progress: 3006 on 8158  Progress: 3007 on 8158  Progress: 3008 on 8158  Progress: 3009 on 8158  Progress: 3010 on 8158  Progress: 3011 on 8158  Progress: 3012 on 8158  Progress: 3013 on 8158  Progress: 3014 on 8158  Progress: 3015 on 8158  Progress: 3016 on 8158  Progress: 3017 on 8158  Progress: 3018 on 8158  Progress: 3019 on 8158  Progress: 3020 on 8158  Progress: 3021 on 8158  Progress: 3022 on 8158  Progress: 3023 on 8158  Progress: 3024 on 8158  Progress: 3025 on 8158  Progress: 3026 on 8158  Progress: 3027 on 8158  Progress: 3028 on 8158  Progress: 3029 on 8158  Progress: 3030 on 8158  Progress: 3031 on 8158  Progress: 3032 on 8158  Progress: 3033 on 8158  Progress: 3034 on 8158  Progress: 3035 on 8158  Progress: 3036 on 8158  Progress: 3037 on 8158  Progress: 3038 on 8158  Progress: 3039 on 8158  Progress: 3040 on 8158  Progress: 3041 on 8158  Progress: 3042 on 8158  Progress: 3043 on 8158  Progress: 3044 on 8158  Progress: 3045 on 8158  Progress: 3046 on 8158  Progress: 3047 on 8158  Progress: 3048 on 8158  Progress: 3049 on 8158  Progress: 3050 on 8158  Progress: 3051 on 8158  Progress: 3052 on 8158  Progress: 3053 on 8158  Progress: 3054 on 8158  Progress: 3055 on 8158  Progress: 3056 on 8158  Progress: 3057 on 8158  Progress: 3058 on 8158  Progress: 3059 on 8158  Progress: 3060 on 8158  Progress: 3061 on 8158  Progress: 3062 on 8158  Progress: 3063 on 8158  Progress: 3064 on 8158  Progress: 3065 on 8158  Progress: 3066 on 8158  Progress: 3067 on 8158  Progress: 3068 on 8158  Progress: 3069 on 8158  Progress: 3070 on 8158  Progress: 3071 on 8158  Progress: 3072 on 8158  Progress: 3073 on 8158  Progress: 3074 on 8158  Progress: 3075 on 8158  Progress: 3076 on 8158  Progress: 3077 on 8158  Progress: 3078 on 8158  Progress: 3079 on 8158  Progress: 3080 on 8158  Progress: 3081 on 8158  Progress: 3082 on 8158  Progress: 3083 on 8158  Progress: 3084 on 8158  Progress: 3085 on 8158  Progress: 3086 on 8158  Progress: 3087 on 8158  Progress: 3088 on 8158  Progress: 3089 on 8158  Progress: 3090 on 8158  Progress: 3091 on 8158  Progress: 3092 on 8158  Progress: 3093 on 8158  Progress: 3094 on 8158  Progress: 3095 on 8158  Progress: 3096 on 8158  Progress: 3097 on 8158  Progress: 3098 on 8158  Progress: 3099 on 8158  Progress: 3100 on 8158  Progress: 3101 on 8158  Progress: 3102 on 8158  Progress: 3103 on 8158  Progress: 3104 on 8158  Progress: 3105 on 8158  Progress: 3106 on 8158  Progress: 3107 on 8158  Progress: 3108 on 8158  Progress: 3109 on 8158  Progress: 3110 on 8158  Progress: 3111 on 8158  Progress: 3112 on 8158  Progress: 3113 on 8158  Progress: 3114 on 8158  Progress: 3115 on 8158  Progress: 3116 on 8158  Progress: 3117 on 8158  Progress: 3118 on 8158  Progress: 3119 on 8158  Progress: 3120 on 8158  Progress: 3121 on 8158  Progress: 3122 on 8158  Progress: 3123 on 8158  Progress: 3124 on 8158  Progress: 3125 on 8158  Progress: 3126 on 8158  Progress: 3127 on 8158  Progress: 3128 on 8158  Progress: 3129 on 8158  Progress: 3130 on 8158  Progress: 3131 on 8158  Progress: 3132 on 8158  Progress: 3133 on 8158  Progress: 3134 on 8158  Progress: 3135 on 8158  Progress: 3136 on 8158  Progress: 3137 on 8158  Progress: 3138 on 8158  Progress: 3139 on 8158  Progress: 3140 on 8158  Progress: 3141 on 8158  Progress: 3142 on 8158  Progress: 3143 on 8158  Progress: 3144 on 8158  Progress: 3145 on 8158  Progress: 3146 on 8158  Progress: 3147 on 8158  Progress: 3148 on 8158  Progress: 3149 on 8158  Progress: 3150 on 8158  Progress: 3151 on 8158  Progress: 3152 on 8158  Progress: 3153 on 8158  Progress: 3154 on 8158  Progress: 3155 on 8158  Progress: 3156 on 8158  Progress: 3157 on 8158  Progress: 3158 on 8158  Progress: 3159 on 8158  Progress: 3160 on 8158  Progress: 3161 on 8158  Progress: 3162 on 8158  Progress: 3163 on 8158  Progress: 3164 on 8158  Progress: 3165 on 8158  Progress: 3166 on 8158  Progress: 3167 on 8158  Progress: 3168 on 8158  Progress: 3169 on 8158  Progress: 3170 on 8158  Progress: 3171 on 8158  Progress: 3172 on 8158  Progress: 3173 on 8158  Progress: 3174 on 8158  Progress: 3175 on 8158  Progress: 3176 on 8158  Progress: 3177 on 8158  Progress: 3178 on 8158  Progress: 3179 on 8158  Progress: 3180 on 8158  Progress: 3181 on 8158  Progress: 3182 on 8158  Progress: 3183 on 8158  Progress: 3184 on 8158  Progress: 3185 on 8158  Progress: 3186 on 8158  Progress: 3187 on 8158  Progress: 3188 on 8158  Progress: 3189 on 8158  Progress: 3190 on 8158  Progress: 3191 on 8158  Progress: 3192 on 8158  Progress: 3193 on 8158  Progress: 3194 on 8158  Progress: 3195 on 8158  Progress: 3196 on 8158  Progress: 3197 on 8158  Progress: 3198 on 8158  Progress: 3199 on 8158  Progress: 3200 on 8158  Progress: 3201 on 8158  Progress: 3202 on 8158  Progress: 3203 on 8158  Progress: 3204 on 8158  Progress: 3205 on 8158  Progress: 3206 on 8158  Progress: 3207 on 8158  Progress: 3208 on 8158  Progress: 3209 on 8158  Progress: 3210 on 8158  Progress: 3211 on 8158  Progress: 3212 on 8158  Progress: 3213 on 8158  Progress: 3214 on 8158  Progress: 3215 on 8158  Progress: 3216 on 8158  Progress: 3217 on 8158  Progress: 3218 on 8158  Progress: 3219 on 8158  Progress: 3220 on 8158  Progress: 3221 on 8158  Progress: 3222 on 8158  Progress: 3223 on 8158  Progress: 3224 on 8158  Progress: 3225 on 8158  Progress: 3226 on 8158  Progress: 3227 on 8158  Progress: 3228 on 8158  Progress: 3229 on 8158  Progress: 3230 on 8158  Progress: 3231 on 8158  Progress: 3232 on 8158  Progress: 3233 on 8158  Progress: 3234 on 8158  Progress: 3235 on 8158  Progress: 3236 on 8158  Progress: 3237 on 8158  Progress: 3238 on 8158  Progress: 3239 on 8158  Progress: 3240 on 8158  Progress: 3241 on 8158  Progress: 3242 on 8158  Progress: 3243 on 8158  Progress: 3244 on 8158  Progress: 3245 on 8158  Progress: 3246 on 8158  Progress: 3247 on 8158  Progress: 3248 on 8158  Progress: 3249 on 8158  Progress: 3250 on 8158  Progress: 3251 on 8158  Progress: 3252 on 8158  Progress: 3253 on 8158  Progress: 3254 on 8158  Progress: 3255 on 8158  Progress: 3256 on 8158  Progress: 3257 on 8158  Progress: 3258 on 8158  Progress: 3259 on 8158  Progress: 3260 on 8158  Progress: 3261 on 8158  Progress: 3262 on 8158  Progress: 3263 on 8158  Progress: 3264 on 8158  Progress: 3265 on 8158  Progress: 3266 on 8158  Progress: 3267 on 8158  Progress: 3268 on 8158  Progress: 3269 on 8158  Progress: 3270 on 8158  Progress: 3271 on 8158  Progress: 3272 on 8158  Progress: 3273 on 8158  Progress: 3274 on 8158  Progress: 3275 on 8158  Progress: 3276 on 8158  Progress: 3277 on 8158  Progress: 3278 on 8158  Progress: 3279 on 8158  Progress: 3280 on 8158  Progress: 3281 on 8158  Progress: 3282 on 8158  Progress: 3283 on 8158  Progress: 3284 on 8158  Progress: 3285 on 8158  Progress: 3286 on 8158  Progress: 3287 on 8158  Progress: 3288 on 8158  Progress: 3289 on 8158  Progress: 3290 on 8158  Progress: 3291 on 8158  Progress: 3292 on 8158  Progress: 3293 on 8158  Progress: 3294 on 8158  Progress: 3295 on 8158  Progress: 3296 on 8158  Progress: 3297 on 8158  Progress: 3298 on 8158  Progress: 3299 on 8158  Progress: 3300 on 8158  Progress: 3301 on 8158  Progress: 3302 on 8158  Progress: 3303 on 8158  Progress: 3304 on 8158  Progress: 3305 on 8158  Progress: 3306 on 8158  Progress: 3307 on 8158  Progress: 3308 on 8158  Progress: 3309 on 8158  Progress: 3310 on 8158  Progress: 3311 on 8158  Progress: 3312 on 8158  Progress: 3313 on 8158  Progress: 3314 on 8158  Progress: 3315 on 8158  Progress: 3316 on 8158  Progress: 3317 on 8158  Progress: 3318 on 8158  Progress: 3319 on 8158  Progress: 3320 on 8158  Progress: 3321 on 8158  Progress: 3322 on 8158  Progress: 3323 on 8158  Progress: 3324 on 8158  Progress: 3325 on 8158  Progress: 3326 on 8158  Progress: 3327 on 8158  Progress: 3328 on 8158  Progress: 3329 on 8158  Progress: 3330 on 8158  Progress: 3331 on 8158  Progress: 3332 on 8158  Progress: 3333 on 8158  Progress: 3334 on 8158  Progress: 3335 on 8158  Progress: 3336 on 8158  Progress: 3337 on 8158  Progress: 3338 on 8158  Progress: 3339 on 8158  Progress: 3340 on 8158  Progress: 3341 on 8158  Progress: 3342 on 8158  Progress: 3343 on 8158  Progress: 3344 on 8158  Progress: 3345 on 8158  Progress: 3346 on 8158  Progress: 3347 on 8158  Progress: 3348 on 8158  Progress: 3349 on 8158  Progress: 3350 on 8158  Progress: 3351 on 8158  Progress: 3352 on 8158  Progress: 3353 on 8158  Progress: 3354 on 8158  Progress: 3355 on 8158  Progress: 3356 on 8158  Progress: 3357 on 8158  Progress: 3358 on 8158  Progress: 3359 on 8158  Progress: 3360 on 8158  Progress: 3361 on 8158  Progress: 3362 on 8158  Progress: 3363 on 8158  Progress: 3364 on 8158  Progress: 3365 on 8158  Progress: 3366 on 8158  Progress: 3367 on 8158  Progress: 3368 on 8158  Progress: 3369 on 8158  Progress: 3370 on 8158  Progress: 3371 on 8158  Progress: 3372 on 8158  Progress: 3373 on 8158  Progress: 3374 on 8158  Progress: 3375 on 8158  Progress: 3376 on 8158  Progress: 3377 on 8158  Progress: 3378 on 8158  Progress: 3379 on 8158  Progress: 3380 on 8158  Progress: 3381 on 8158  Progress: 3382 on 8158  Progress: 3383 on 8158  Progress: 3384 on 8158  Progress: 3385 on 8158  Progress: 3386 on 8158  Progress: 3387 on 8158  Progress: 3388 on 8158  Progress: 3389 on 8158  Progress: 3390 on 8158  Progress: 3391 on 8158  Progress: 3392 on 8158  Progress: 3393 on 8158  Progress: 3394 on 8158  Progress: 3395 on 8158  Progress: 3396 on 8158  Progress: 3397 on 8158  Progress: 3398 on 8158  Progress: 3399 on 8158  Progress: 3400 on 8158  Progress: 3401 on 8158  Progress: 3402 on 8158  Progress: 3403 on 8158  Progress: 3404 on 8158  Progress: 3405 on 8158  Progress: 3406 on 8158  Progress: 3407 on 8158  Progress: 3408 on 8158  Progress: 3409 on 8158  Progress: 3410 on 8158  Progress: 3411 on 8158  Progress: 3412 on 8158  Progress: 3413 on 8158  Progress: 3414 on 8158  Progress: 3415 on 8158  Progress: 3416 on 8158  Progress: 3417 on 8158  Progress: 3418 on 8158  Progress: 3419 on 8158  Progress: 3420 on 8158  Progress: 3421 on 8158  Progress: 3422 on 8158  Progress: 3423 on 8158  Progress: 3424 on 8158  Progress: 3425 on 8158  Progress: 3426 on 8158  Progress: 3427 on 8158  Progress: 3428 on 8158  Progress: 3429 on 8158  Progress: 3430 on 8158  Progress: 3431 on 8158  Progress: 3432 on 8158  Progress: 3433 on 8158  Progress: 3434 on 8158  Progress: 3435 on 8158  Progress: 3436 on 8158  Progress: 3437 on 8158  Progress: 3438 on 8158  Progress: 3439 on 8158  Progress: 3440 on 8158  Progress: 3441 on 8158  Progress: 3442 on 8158  Progress: 3443 on 8158  Progress: 3444 on 8158  Progress: 3445 on 8158  Progress: 3446 on 8158  Progress: 3447 on 8158  Progress: 3448 on 8158  Progress: 3449 on 8158  Progress: 3450 on 8158  Progress: 3451 on 8158  Progress: 3452 on 8158  Progress: 3453 on 8158  Progress: 3454 on 8158  Progress: 3455 on 8158  Progress: 3456 on 8158  Progress: 3457 on 8158  Progress: 3458 on 8158  Progress: 3459 on 8158  Progress: 3460 on 8158  Progress: 3461 on 8158  Progress: 3462 on 8158  Progress: 3463 on 8158  Progress: 3464 on 8158  Progress: 3465 on 8158  Progress: 3466 on 8158  Progress: 3467 on 8158  Progress: 3468 on 8158  Progress: 3469 on 8158  Progress: 3470 on 8158  Progress: 3471 on 8158  Progress: 3472 on 8158  Progress: 3473 on 8158  Progress: 3474 on 8158  Progress: 3475 on 8158  Progress: 3476 on 8158  Progress: 3477 on 8158  Progress: 3478 on 8158  Progress: 3479 on 8158  Progress: 3480 on 8158  Progress: 3481 on 8158  Progress: 3482 on 8158  Progress: 3483 on 8158  Progress: 3484 on 8158  Progress: 3485 on 8158  Progress: 3486 on 8158  Progress: 3487 on 8158  Progress: 3488 on 8158  Progress: 3489 on 8158  Progress: 3490 on 8158  Progress: 3491 on 8158  Progress: 3492 on 8158  Progress: 3493 on 8158  Progress: 3494 on 8158  Progress: 3495 on 8158  Progress: 3496 on 8158  Progress: 3497 on 8158  Progress: 3498 on 8158  Progress: 3499 on 8158  Progress: 3500 on 8158  Progress: 3501 on 8158  Progress: 3502 on 8158  Progress: 3503 on 8158  Progress: 3504 on 8158  Progress: 3505 on 8158  Progress: 3506 on 8158  Progress: 3507 on 8158  Progress: 3508 on 8158  Progress: 3509 on 8158  Progress: 3510 on 8158  Progress: 3511 on 8158  Progress: 3512 on 8158  Progress: 3513 on 8158  Progress: 3514 on 8158  Progress: 3515 on 8158  Progress: 3516 on 8158  Progress: 3517 on 8158  Progress: 3518 on 8158  Progress: 3519 on 8158  Progress: 3520 on 8158  Progress: 3521 on 8158  Progress: 3522 on 8158  Progress: 3523 on 8158  Progress: 3524 on 8158  Progress: 3525 on 8158  Progress: 3526 on 8158  Progress: 3527 on 8158  Progress: 3528 on 8158  Progress: 3529 on 8158  Progress: 3530 on 8158  Progress: 3531 on 8158  Progress: 3532 on 8158  Progress: 3533 on 8158  Progress: 3534 on 8158  Progress: 3535 on 8158  Progress: 3536 on 8158  Progress: 3537 on 8158  Progress: 3538 on 8158  Progress: 3539 on 8158  Progress: 3540 on 8158  Progress: 3541 on 8158  Progress: 3542 on 8158  Progress: 3543 on 8158  Progress: 3544 on 8158  Progress: 3545 on 8158  Progress: 3546 on 8158  Progress: 3547 on 8158  Progress: 3548 on 8158  Progress: 3549 on 8158  Progress: 3550 on 8158  Progress: 3551 on 8158  Progress: 3552 on 8158  Progress: 3553 on 8158  Progress: 3554 on 8158  Progress: 3555 on 8158  Progress: 3556 on 8158  Progress: 3557 on 8158  Progress: 3558 on 8158  Progress: 3559 on 8158  Progress: 3560 on 8158  Progress: 3561 on 8158  Progress: 3562 on 8158  Progress: 3563 on 8158  Progress: 3564 on 8158  Progress: 3565 on 8158  Progress: 3566 on 8158  Progress: 3567 on 8158  Progress: 3568 on 8158  Progress: 3569 on 8158  Progress: 3570 on 8158  Progress: 3571 on 8158  Progress: 3572 on 8158  Progress: 3573 on 8158  Progress: 3574 on 8158  Progress: 3575 on 8158  Progress: 3576 on 8158  Progress: 3577 on 8158  Progress: 3578 on 8158  Progress: 3579 on 8158  Progress: 3580 on 8158  Progress: 3581 on 8158  Progress: 3582 on 8158  Progress: 3583 on 8158  Progress: 3584 on 8158  Progress: 3585 on 8158  Progress: 3586 on 8158  Progress: 3587 on 8158  Progress: 3588 on 8158  Progress: 3589 on 8158  Progress: 3590 on 8158  Progress: 3591 on 8158  Progress: 3592 on 8158  Progress: 3593 on 8158  Progress: 3594 on 8158  Progress: 3595 on 8158  Progress: 3596 on 8158  Progress: 3597 on 8158  Progress: 3598 on 8158  Progress: 3599 on 8158  Progress: 3600 on 8158  Progress: 3601 on 8158  Progress: 3602 on 8158  Progress: 3603 on 8158  Progress: 3604 on 8158  Progress: 3605 on 8158  Progress: 3606 on 8158  Progress: 3607 on 8158  Progress: 3608 on 8158  Progress: 3609 on 8158  Progress: 3610 on 8158  Progress: 3611 on 8158  Progress: 3612 on 8158  Progress: 3613 on 8158  Progress: 3614 on 8158  Progress: 3615 on 8158  Progress: 3616 on 8158  Progress: 3617 on 8158  Progress: 3618 on 8158  Progress: 3619 on 8158  Progress: 3620 on 8158  Progress: 3621 on 8158  Progress: 3622 on 8158  Progress: 3623 on 8158  Progress: 3624 on 8158  Progress: 3625 on 8158  Progress: 3626 on 8158  Progress: 3627 on 8158  Progress: 3628 on 8158  Progress: 3629 on 8158  Progress: 3630 on 8158  Progress: 3631 on 8158  Progress: 3632 on 8158  Progress: 3633 on 8158  Progress: 3634 on 8158  Progress: 3635 on 8158  Progress: 3636 on 8158  Progress: 3637 on 8158  Progress: 3638 on 8158  Progress: 3639 on 8158  Progress: 3640 on 8158  Progress: 3641 on 8158  Progress: 3642 on 8158  Progress: 3643 on 8158  Progress: 3644 on 8158  Progress: 3645 on 8158  Progress: 3646 on 8158  Progress: 3647 on 8158  Progress: 3648 on 8158  Progress: 3649 on 8158  Progress: 3650 on 8158  Progress: 3651 on 8158  Progress: 3652 on 8158  Progress: 3653 on 8158  Progress: 3654 on 8158  Progress: 3655 on 8158  Progress: 3656 on 8158  Progress: 3657 on 8158  Progress: 3658 on 8158  Progress: 3659 on 8158  Progress: 3660 on 8158  Progress: 3661 on 8158  Progress: 3662 on 8158  Progress: 3663 on 8158  Progress: 3664 on 8158  Progress: 3665 on 8158  Progress: 3666 on 8158  Progress: 3667 on 8158  Progress: 3668 on 8158  Progress: 3669 on 8158  Progress: 3670 on 8158  Progress: 3671 on 8158  Progress: 3672 on 8158  Progress: 3673 on 8158  Progress: 3674 on 8158  Progress: 3675 on 8158  Progress: 3676 on 8158  Progress: 3677 on 8158  Progress: 3678 on 8158  Progress: 3679 on 8158  Progress: 3680 on 8158  Progress: 3681 on 8158  Progress: 3682 on 8158  Progress: 3683 on 8158  Progress: 3684 on 8158  Progress: 3685 on 8158  Progress: 3686 on 8158  Progress: 3687 on 8158  Progress: 3688 on 8158  Progress: 3689 on 8158  Progress: 3690 on 8158  Progress: 3691 on 8158  Progress: 3692 on 8158  Progress: 3693 on 8158  Progress: 3694 on 8158  Progress: 3695 on 8158  Progress: 3696 on 8158  Progress: 3697 on 8158  Progress: 3698 on 8158  Progress: 3699 on 8158  Progress: 3700 on 8158  Progress: 3701 on 8158  Progress: 3702 on 8158  Progress: 3703 on 8158  Progress: 3704 on 8158  Progress: 3705 on 8158  Progress: 3706 on 8158  Progress: 3707 on 8158  Progress: 3708 on 8158  Progress: 3709 on 8158  Progress: 3710 on 8158  Progress: 3711 on 8158  Progress: 3712 on 8158  Progress: 3713 on 8158  Progress: 3714 on 8158  Progress: 3715 on 8158  Progress: 3716 on 8158  Progress: 3717 on 8158  Progress: 3718 on 8158  Progress: 3719 on 8158  Progress: 3720 on 8158  Progress: 3721 on 8158  Progress: 3722 on 8158  Progress: 3723 on 8158  Progress: 3724 on 8158  Progress: 3725 on 8158  Progress: 3726 on 8158  Progress: 3727 on 8158  Progress: 3728 on 8158  Progress: 3729 on 8158  Progress: 3730 on 8158  Progress: 3731 on 8158  Progress: 3732 on 8158  Progress: 3733 on 8158  Progress: 3734 on 8158  Progress: 3735 on 8158  Progress: 3736 on 8158  Progress: 3737 on 8158  Progress: 3738 on 8158  Progress: 3739 on 8158  Progress: 3740 on 8158  Progress: 3741 on 8158  Progress: 3742 on 8158  Progress: 3743 on 8158  Progress: 3744 on 8158  Progress: 3745 on 8158  Progress: 3746 on 8158  Progress: 3747 on 8158  Progress: 3748 on 8158  Progress: 3749 on 8158  Progress: 3750 on 8158  Progress: 3751 on 8158  Progress: 3752 on 8158  Progress: 3753 on 8158  Progress: 3754 on 8158  Progress: 3755 on 8158  Progress: 3756 on 8158  Progress: 3757 on 8158  Progress: 3758 on 8158  Progress: 3759 on 8158  Progress: 3760 on 8158  Progress: 3761 on 8158  Progress: 3762 on 8158  Progress: 3763 on 8158  Progress: 3764 on 8158  Progress: 3765 on 8158  Progress: 3766 on 8158  Progress: 3767 on 8158  Progress: 3768 on 8158  Progress: 3769 on 8158  Progress: 3770 on 8158  Progress: 3771 on 8158  Progress: 3772 on 8158  Progress: 3773 on 8158  Progress: 3774 on 8158  Progress: 3775 on 8158  Progress: 3776 on 8158  Progress: 3777 on 8158  Progress: 3778 on 8158  Progress: 3779 on 8158  Progress: 3780 on 8158  Progress: 3781 on 8158  Progress: 3782 on 8158  Progress: 3783 on 8158  Progress: 3784 on 8158  Progress: 3785 on 8158  Progress: 3786 on 8158  Progress: 3787 on 8158  Progress: 3788 on 8158  Progress: 3789 on 8158  Progress: 3790 on 8158  Progress: 3791 on 8158  Progress: 3792 on 8158  Progress: 3793 on 8158  Progress: 3794 on 8158  Progress: 3795 on 8158  Progress: 3796 on 8158  Progress: 3797 on 8158  Progress: 3798 on 8158  Progress: 3799 on 8158  Progress: 3800 on 8158  Progress: 3801 on 8158  Progress: 3802 on 8158  Progress: 3803 on 8158  Progress: 3804 on 8158  Progress: 3805 on 8158  Progress: 3806 on 8158  Progress: 3807 on 8158  Progress: 3808 on 8158  Progress: 3809 on 8158  Progress: 3810 on 8158  Progress: 3811 on 8158  Progress: 3812 on 8158  Progress: 3813 on 8158  Progress: 3814 on 8158  Progress: 3815 on 8158  Progress: 3816 on 8158  Progress: 3817 on 8158  Progress: 3818 on 8158  Progress: 3819 on 8158  Progress: 3820 on 8158  Progress: 3821 on 8158  Progress: 3822 on 8158  Progress: 3823 on 8158  Progress: 3824 on 8158  Progress: 3825 on 8158  Progress: 3826 on 8158  Progress: 3827 on 8158  Progress: 3828 on 8158  Progress: 3829 on 8158  Progress: 3830 on 8158  Progress: 3831 on 8158  Progress: 3832 on 8158  Progress: 3833 on 8158  Progress: 3834 on 8158  Progress: 3835 on 8158  Progress: 3836 on 8158  Progress: 3837 on 8158  Progress: 3838 on 8158  Progress: 3839 on 8158  Progress: 3840 on 8158  Progress: 3841 on 8158  Progress: 3842 on 8158  Progress: 3843 on 8158  Progress: 3844 on 8158  Progress: 3845 on 8158  Progress: 3846 on 8158  Progress: 3847 on 8158  Progress: 3848 on 8158  Progress: 3849 on 8158  Progress: 3850 on 8158  Progress: 3851 on 8158  Progress: 3852 on 8158  Progress: 3853 on 8158  Progress: 3854 on 8158  Progress: 3855 on 8158  Progress: 3856 on 8158  Progress: 3857 on 8158  Progress: 3858 on 8158  Progress: 3859 on 8158  Progress: 3860 on 8158  Progress: 3861 on 8158  Progress: 3862 on 8158  Progress: 3863 on 8158  Progress: 3864 on 8158  Progress: 3865 on 8158  Progress: 3866 on 8158  Progress: 3867 on 8158  Progress: 3868 on 8158  Progress: 3869 on 8158  Progress: 3870 on 8158  Progress: 3871 on 8158  Progress: 3872 on 8158  Progress: 3873 on 8158  Progress: 3874 on 8158  Progress: 3875 on 8158  Progress: 3876 on 8158  Progress: 3877 on 8158  Progress: 3878 on 8158  Progress: 3879 on 8158  Progress: 3880 on 8158  Progress: 3881 on 8158  Progress: 3882 on 8158  Progress: 3883 on 8158  Progress: 3884 on 8158  Progress: 3885 on 8158  Progress: 3886 on 8158  Progress: 3887 on 8158  Progress: 3888 on 8158  Progress: 3889 on 8158  Progress: 3890 on 8158  Progress: 3891 on 8158  Progress: 3892 on 8158  Progress: 3893 on 8158  Progress: 3894 on 8158  Progress: 3895 on 8158  Progress: 3896 on 8158  Progress: 3897 on 8158  Progress: 3898 on 8158  Progress: 3899 on 8158  Progress: 3900 on 8158  Progress: 3901 on 8158  Progress: 3902 on 8158  Progress: 3903 on 8158  Progress: 3904 on 8158  Progress: 3905 on 8158  Progress: 3906 on 8158  Progress: 3907 on 8158  Progress: 3908 on 8158  Progress: 3909 on 8158  Progress: 3910 on 8158  Progress: 3911 on 8158  Progress: 3912 on 8158  Progress: 3913 on 8158  Progress: 3914 on 8158  Progress: 3915 on 8158  Progress: 3916 on 8158  Progress: 3917 on 8158  Progress: 3918 on 8158  Progress: 3919 on 8158  Progress: 3920 on 8158  Progress: 3921 on 8158  Progress: 3922 on 8158  Progress: 3923 on 8158  Progress: 3924 on 8158  Progress: 3925 on 8158  Progress: 3926 on 8158  Progress: 3927 on 8158  Progress: 3928 on 8158  Progress: 3929 on 8158  Progress: 3930 on 8158  Progress: 3931 on 8158  Progress: 3932 on 8158  Progress: 3933 on 8158  Progress: 3934 on 8158  Progress: 3935 on 8158  Progress: 3936 on 8158  Progress: 3937 on 8158  Progress: 3938 on 8158  Progress: 3939 on 8158  Progress: 3940 on 8158  Progress: 3941 on 8158  Progress: 3942 on 8158  Progress: 3943 on 8158  Progress: 3944 on 8158  Progress: 3945 on 8158  Progress: 3946 on 8158  Progress: 3947 on 8158  Progress: 3948 on 8158  Progress: 3949 on 8158  Progress: 3950 on 8158  Progress: 3951 on 8158  Progress: 3952 on 8158  Progress: 3953 on 8158  Progress: 3954 on 8158  Progress: 3955 on 8158  Progress: 3956 on 8158  Progress: 3957 on 8158  Progress: 3958 on 8158  Progress: 3959 on 8158  Progress: 3960 on 8158  Progress: 3961 on 8158  Progress: 3962 on 8158  Progress: 3963 on 8158  Progress: 3964 on 8158  Progress: 3965 on 8158  Progress: 3966 on 8158  Progress: 3967 on 8158  Progress: 3968 on 8158  Progress: 3969 on 8158  Progress: 3970 on 8158  Progress: 3971 on 8158  Progress: 3972 on 8158  Progress: 3973 on 8158  Progress: 3974 on 8158  Progress: 3975 on 8158  Progress: 3976 on 8158  Progress: 3977 on 8158  Progress: 3978 on 8158  Progress: 3979 on 8158  Progress: 3980 on 8158  Progress: 3981 on 8158  Progress: 3982 on 8158  Progress: 3983 on 8158  Progress: 3984 on 8158  Progress: 3985 on 8158  Progress: 3986 on 8158  Progress: 3987 on 8158  Progress: 3988 on 8158  Progress: 3989 on 8158  Progress: 3990 on 8158  Progress: 3991 on 8158  Progress: 3992 on 8158  Progress: 3993 on 8158  Progress: 3994 on 8158  Progress: 3995 on 8158  Progress: 3996 on 8158  Progress: 3997 on 8158  Progress: 3998 on 8158  Progress: 3999 on 8158  Progress: 4000 on 8158  Progress: 4001 on 8158  Progress: 4002 on 8158  Progress: 4003 on 8158  Progress: 4004 on 8158  Progress: 4005 on 8158  Progress: 4006 on 8158  Progress: 4007 on 8158  Progress: 4008 on 8158  Progress: 4009 on 8158  Progress: 4010 on 8158  Progress: 4011 on 8158  Progress: 4012 on 8158  Progress: 4013 on 8158  Progress: 4014 on 8158  Progress: 4015 on 8158  Progress: 4016 on 8158  Progress: 4017 on 8158  Progress: 4018 on 8158  Progress: 4019 on 8158  Progress: 4020 on 8158  Progress: 4021 on 8158  Progress: 4022 on 8158  Progress: 4023 on 8158  Progress: 4024 on 8158  Progress: 4025 on 8158  Progress: 4026 on 8158  Progress: 4027 on 8158  Progress: 4028 on 8158  Progress: 4029 on 8158  Progress: 4030 on 8158  Progress: 4031 on 8158  Progress: 4032 on 8158  Progress: 4033 on 8158  Progress: 4034 on 8158  Progress: 4035 on 8158  Progress: 4036 on 8158  Progress: 4037 on 8158  Progress: 4038 on 8158  Progress: 4039 on 8158  Progress: 4040 on 8158  Progress: 4041 on 8158  Progress: 4042 on 8158  Progress: 4043 on 8158  Progress: 4044 on 8158  Progress: 4045 on 8158  Progress: 4046 on 8158  Progress: 4047 on 8158  Progress: 4048 on 8158  Progress: 4049 on 8158  Progress: 4050 on 8158  Progress: 4051 on 8158  Progress: 4052 on 8158  Progress: 4053 on 8158  Progress: 4054 on 8158  Progress: 4055 on 8158  Progress: 4056 on 8158  Progress: 4057 on 8158  Progress: 4058 on 8158  Progress: 4059 on 8158  Progress: 4060 on 8158  Progress: 4061 on 8158  Progress: 4062 on 8158  Progress: 4063 on 8158  Progress: 4064 on 8158  Progress: 4065 on 8158  Progress: 4066 on 8158  Progress: 4067 on 8158  Progress: 4068 on 8158  Progress: 4069 on 8158  Progress: 4070 on 8158  Progress: 4071 on 8158  Progress: 4072 on 8158  Progress: 4073 on 8158  Progress: 4074 on 8158  Progress: 4075 on 8158  Progress: 4076 on 8158  Progress: 4077 on 8158  Progress: 4078 on 8158  Progress: 4079 on 8158  Progress: 4080 on 8158  Progress: 4081 on 8158  Progress: 4082 on 8158  Progress: 4083 on 8158  Progress: 4084 on 8158  Progress: 4085 on 8158  Progress: 4086 on 8158  Progress: 4087 on 8158  Progress: 4088 on 8158  Progress: 4089 on 8158  Progress: 4090 on 8158  Progress: 4091 on 8158  Progress: 4092 on 8158  Progress: 4093 on 8158  Progress: 4094 on 8158  Progress: 4095 on 8158  Progress: 4096 on 8158  Progress: 4097 on 8158  Progress: 4098 on 8158  Progress: 4099 on 8158  Progress: 4100 on 8158  Progress: 4101 on 8158  Progress: 4102 on 8158  Progress: 4103 on 8158  Progress: 4104 on 8158  Progress: 4105 on 8158  Progress: 4106 on 8158  Progress: 4107 on 8158  Progress: 4108 on 8158  Progress: 4109 on 8158  Progress: 4110 on 8158  Progress: 4111 on 8158  Progress: 4112 on 8158  Progress: 4113 on 8158  Progress: 4114 on 8158  Progress: 4115 on 8158  Progress: 4116 on 8158  Progress: 4117 on 8158  Progress: 4118 on 8158  Progress: 4119 on 8158  Progress: 4120 on 8158  Progress: 4121 on 8158  Progress: 4122 on 8158  Progress: 4123 on 8158  Progress: 4124 on 8158  Progress: 4125 on 8158  Progress: 4126 on 8158  Progress: 4127 on 8158  Progress: 4128 on 8158  Progress: 4129 on 8158  Progress: 4130 on 8158  Progress: 4131 on 8158  Progress: 4132 on 8158  Progress: 4133 on 8158  Progress: 4134 on 8158  Progress: 4135 on 8158  Progress: 4136 on 8158  Progress: 4137 on 8158  Progress: 4138 on 8158  Progress: 4139 on 8158  Progress: 4140 on 8158  Progress: 4141 on 8158  Progress: 4142 on 8158  Progress: 4143 on 8158  Progress: 4144 on 8158  Progress: 4145 on 8158  Progress: 4146 on 8158  Progress: 4147 on 8158  Progress: 4148 on 8158  Progress: 4149 on 8158  Progress: 4150 on 8158  Progress: 4151 on 8158  Progress: 4152 on 8158  Progress: 4153 on 8158  Progress: 4154 on 8158  Progress: 4155 on 8158  Progress: 4156 on 8158  Progress: 4157 on 8158  Progress: 4158 on 8158  Progress: 4159 on 8158  Progress: 4160 on 8158  Progress: 4161 on 8158  Progress: 4162 on 8158  Progress: 4163 on 8158  Progress: 4164 on 8158  Progress: 4165 on 8158  Progress: 4166 on 8158  Progress: 4167 on 8158  Progress: 4168 on 8158  Progress: 4169 on 8158  Progress: 4170 on 8158  Progress: 4171 on 8158  Progress: 4172 on 8158  Progress: 4173 on 8158  Progress: 4174 on 8158  Progress: 4175 on 8158  Progress: 4176 on 8158  Progress: 4177 on 8158  Progress: 4178 on 8158  Progress: 4179 on 8158  Progress: 4180 on 8158  Progress: 4181 on 8158  Progress: 4182 on 8158  Progress: 4183 on 8158  Progress: 4184 on 8158  Progress: 4185 on 8158  Progress: 4186 on 8158  Progress: 4187 on 8158  Progress: 4188 on 8158  Progress: 4189 on 8158  Progress: 4190 on 8158  Progress: 4191 on 8158  Progress: 4192 on 8158  Progress: 4193 on 8158  Progress: 4194 on 8158  Progress: 4195 on 8158  Progress: 4196 on 8158  Progress: 4197 on 8158  Progress: 4198 on 8158  Progress: 4199 on 8158  Progress: 4200 on 8158  Progress: 4201 on 8158  Progress: 4202 on 8158  Progress: 4203 on 8158  Progress: 4204 on 8158  Progress: 4205 on 8158  Progress: 4206 on 8158  Progress: 4207 on 8158  Progress: 4208 on 8158  Progress: 4209 on 8158  Progress: 4210 on 8158  Progress: 4211 on 8158  Progress: 4212 on 8158  Progress: 4213 on 8158  Progress: 4214 on 8158  Progress: 4215 on 8158  Progress: 4216 on 8158  Progress: 4217 on 8158  Progress: 4218 on 8158  Progress: 4219 on 8158  Progress: 4220 on 8158  Progress: 4221 on 8158  Progress: 4222 on 8158  Progress: 4223 on 8158  Progress: 4224 on 8158  Progress: 4225 on 8158  Progress: 4226 on 8158  Progress: 4227 on 8158  Progress: 4228 on 8158  Progress: 4229 on 8158  Progress: 4230 on 8158  Progress: 4231 on 8158  Progress: 4232 on 8158  Progress: 4233 on 8158  Progress: 4234 on 8158  Progress: 4235 on 8158  Progress: 4236 on 8158  Progress: 4237 on 8158  Progress: 4238 on 8158  Progress: 4239 on 8158  Progress: 4240 on 8158  Progress: 4241 on 8158  Progress: 4242 on 8158  Progress: 4243 on 8158  Progress: 4244 on 8158  Progress: 4245 on 8158  Progress: 4246 on 8158  Progress: 4247 on 8158  Progress: 4248 on 8158  Progress: 4249 on 8158  Progress: 4250 on 8158  Progress: 4251 on 8158  Progress: 4252 on 8158  Progress: 4253 on 8158  Progress: 4254 on 8158  Progress: 4255 on 8158  Progress: 4256 on 8158  Progress: 4257 on 8158  Progress: 4258 on 8158  Progress: 4259 on 8158  Progress: 4260 on 8158  Progress: 4261 on 8158  Progress: 4262 on 8158  Progress: 4263 on 8158  Progress: 4264 on 8158  Progress: 4265 on 8158  Progress: 4266 on 8158  Progress: 4267 on 8158  Progress: 4268 on 8158  Progress: 4269 on 8158  Progress: 4270 on 8158  Progress: 4271 on 8158  Progress: 4272 on 8158  Progress: 4273 on 8158  Progress: 4274 on 8158  Progress: 4275 on 8158  Progress: 4276 on 8158  Progress: 4277 on 8158  Progress: 4278 on 8158  Progress: 4279 on 8158  Progress: 4280 on 8158  Progress: 4281 on 8158  Progress: 4282 on 8158  Progress: 4283 on 8158  Progress: 4284 on 8158  Progress: 4285 on 8158  Progress: 4286 on 8158  Progress: 4287 on 8158  Progress: 4288 on 8158  Progress: 4289 on 8158  Progress: 4290 on 8158  Progress: 4291 on 8158  Progress: 4292 on 8158  Progress: 4293 on 8158  Progress: 4294 on 8158  Progress: 4295 on 8158  Progress: 4296 on 8158  Progress: 4297 on 8158  Progress: 4298 on 8158  Progress: 4299 on 8158  Progress: 4300 on 8158  Progress: 4301 on 8158  Progress: 4302 on 8158  Progress: 4303 on 8158  Progress: 4304 on 8158  Progress: 4305 on 8158  Progress: 4306 on 8158  Progress: 4307 on 8158  Progress: 4308 on 8158  Progress: 4309 on 8158  Progress: 4310 on 8158  Progress: 4311 on 8158  Progress: 4312 on 8158  Progress: 4313 on 8158  Progress: 4314 on 8158  Progress: 4315 on 8158  Progress: 4316 on 8158  Progress: 4317 on 8158  Progress: 4318 on 8158  Progress: 4319 on 8158  Progress: 4320 on 8158  Progress: 4321 on 8158  Progress: 4322 on 8158  Progress: 4323 on 8158  Progress: 4324 on 8158  Progress: 4325 on 8158  Progress: 4326 on 8158  Progress: 4327 on 8158  Progress: 4328 on 8158  Progress: 4329 on 8158  Progress: 4330 on 8158  Progress: 4331 on 8158  Progress: 4332 on 8158  Progress: 4333 on 8158  Progress: 4334 on 8158  Progress: 4335 on 8158  Progress: 4336 on 8158  Progress: 4337 on 8158  Progress: 4338 on 8158  Progress: 4339 on 8158  Progress: 4340 on 8158  Progress: 4341 on 8158  Progress: 4342 on 8158  Progress: 4343 on 8158  Progress: 4344 on 8158  Progress: 4345 on 8158  Progress: 4346 on 8158  Progress: 4347 on 8158  Progress: 4348 on 8158  Progress: 4349 on 8158  Progress: 4350 on 8158  Progress: 4351 on 8158  Progress: 4352 on 8158  Progress: 4353 on 8158  Progress: 4354 on 8158  Progress: 4355 on 8158  Progress: 4356 on 8158  Progress: 4357 on 8158  Progress: 4358 on 8158  Progress: 4359 on 8158  Progress: 4360 on 8158  Progress: 4361 on 8158  Progress: 4362 on 8158  Progress: 4363 on 8158  Progress: 4364 on 8158  Progress: 4365 on 8158  Progress: 4366 on 8158  Progress: 4367 on 8158  Progress: 4368 on 8158  Progress: 4369 on 8158  Progress: 4370 on 8158  Progress: 4371 on 8158  Progress: 4372 on 8158  Progress: 4373 on 8158  Progress: 4374 on 8158  Progress: 4375 on 8158  Progress: 4376 on 8158  Progress: 4377 on 8158  Progress: 4378 on 8158  Progress: 4379 on 8158  Progress: 4380 on 8158  Progress: 4381 on 8158  Progress: 4382 on 8158  Progress: 4383 on 8158  Progress: 4384 on 8158  Progress: 4385 on 8158  Progress: 4386 on 8158  Progress: 4387 on 8158  Progress: 4388 on 8158  Progress: 4389 on 8158  Progress: 4390 on 8158  Progress: 4391 on 8158  Progress: 4392 on 8158  Progress: 4393 on 8158  Progress: 4394 on 8158  Progress: 4395 on 8158  Progress: 4396 on 8158  Progress: 4397 on 8158  Progress: 4398 on 8158  Progress: 4399 on 8158  Progress: 4400 on 8158  Progress: 4401 on 8158  Progress: 4402 on 8158  Progress: 4403 on 8158  Progress: 4404 on 8158  Progress: 4405 on 8158  Progress: 4406 on 8158  Progress: 4407 on 8158  Progress: 4408 on 8158  Progress: 4409 on 8158  Progress: 4410 on 8158  Progress: 4411 on 8158  Progress: 4412 on 8158  Progress: 4413 on 8158  Progress: 4414 on 8158  Progress: 4415 on 8158  Progress: 4416 on 8158  Progress: 4417 on 8158  Progress: 4418 on 8158  Progress: 4419 on 8158  Progress: 4420 on 8158  Progress: 4421 on 8158  Progress: 4422 on 8158  Progress: 4423 on 8158  Progress: 4424 on 8158  Progress: 4425 on 8158  Progress: 4426 on 8158  Progress: 4427 on 8158  Progress: 4428 on 8158  Progress: 4429 on 8158  Progress: 4430 on 8158  Progress: 4431 on 8158  Progress: 4432 on 8158  Progress: 4433 on 8158  Progress: 4434 on 8158  Progress: 4435 on 8158  Progress: 4436 on 8158  Progress: 4437 on 8158  Progress: 4438 on 8158  Progress: 4439 on 8158  Progress: 4440 on 8158  Progress: 4441 on 8158  Progress: 4442 on 8158  Progress: 4443 on 8158  Progress: 4444 on 8158  Progress: 4445 on 8158  Progress: 4446 on 8158  Progress: 4447 on 8158  Progress: 4448 on 8158  Progress: 4449 on 8158  Progress: 4450 on 8158  Progress: 4451 on 8158  Progress: 4452 on 8158  Progress: 4453 on 8158  Progress: 4454 on 8158  Progress: 4455 on 8158  Progress: 4456 on 8158  Progress: 4457 on 8158  Progress: 4458 on 8158  Progress: 4459 on 8158  Progress: 4460 on 8158  Progress: 4461 on 8158  Progress: 4462 on 8158  Progress: 4463 on 8158  Progress: 4464 on 8158  Progress: 4465 on 8158  Progress: 4466 on 8158  Progress: 4467 on 8158  Progress: 4468 on 8158  Progress: 4469 on 8158  Progress: 4470 on 8158  Progress: 4471 on 8158  Progress: 4472 on 8158  Progress: 4473 on 8158  Progress: 4474 on 8158  Progress: 4475 on 8158  Progress: 4476 on 8158  Progress: 4477 on 8158  Progress: 4478 on 8158  Progress: 4479 on 8158  Progress: 4480 on 8158  Progress: 4481 on 8158  Progress: 4482 on 8158  Progress: 4483 on 8158  Progress: 4484 on 8158  Progress: 4485 on 8158  Progress: 4486 on 8158  Progress: 4487 on 8158  Progress: 4488 on 8158  Progress: 4489 on 8158  Progress: 4490 on 8158  Progress: 4491 on 8158  Progress: 4492 on 8158  Progress: 4493 on 8158  Progress: 4494 on 8158  Progress: 4495 on 8158  Progress: 4496 on 8158  Progress: 4497 on 8158  Progress: 4498 on 8158  Progress: 4499 on 8158  Progress: 4500 on 8158  Progress: 4501 on 8158  Progress: 4502 on 8158  Progress: 4503 on 8158  Progress: 4504 on 8158  Progress: 4505 on 8158  Progress: 4506 on 8158  Progress: 4507 on 8158  Progress: 4508 on 8158  Progress: 4509 on 8158  Progress: 4510 on 8158  Progress: 4511 on 8158  Progress: 4512 on 8158  Progress: 4513 on 8158  Progress: 4514 on 8158  Progress: 4515 on 8158  Progress: 4516 on 8158  Progress: 4517 on 8158  Progress: 4518 on 8158  Progress: 4519 on 8158  Progress: 4520 on 8158  Progress: 4521 on 8158  Progress: 4522 on 8158  Progress: 4523 on 8158  Progress: 4524 on 8158  Progress: 4525 on 8158  Progress: 4526 on 8158  Progress: 4527 on 8158  Progress: 4528 on 8158  Progress: 4529 on 8158  Progress: 4530 on 8158  Progress: 4531 on 8158  Progress: 4532 on 8158  Progress: 4533 on 8158  Progress: 4534 on 8158  Progress: 4535 on 8158  Progress: 4536 on 8158  Progress: 4537 on 8158  Progress: 4538 on 8158  Progress: 4539 on 8158  Progress: 4540 on 8158  Progress: 4541 on 8158  Progress: 4542 on 8158  Progress: 4543 on 8158  Progress: 4544 on 8158  Progress: 4545 on 8158  Progress: 4546 on 8158  Progress: 4547 on 8158  Progress: 4548 on 8158  Progress: 4549 on 8158  Progress: 4550 on 8158  Progress: 4551 on 8158  Progress: 4552 on 8158  Progress: 4553 on 8158  Progress: 4554 on 8158  Progress: 4555 on 8158  Progress: 4556 on 8158  Progress: 4557 on 8158  Progress: 4558 on 8158  Progress: 4559 on 8158  Progress: 4560 on 8158  Progress: 4561 on 8158  Progress: 4562 on 8158  Progress: 4563 on 8158  Progress: 4564 on 8158  Progress: 4565 on 8158  Progress: 4566 on 8158  Progress: 4567 on 8158  Progress: 4568 on 8158  Progress: 4569 on 8158  Progress: 4570 on 8158  Progress: 4571 on 8158  Progress: 4572 on 8158  Progress: 4573 on 8158  Progress: 4574 on 8158  Progress: 4575 on 8158  Progress: 4576 on 8158  Progress: 4577 on 8158  Progress: 4578 on 8158  Progress: 4579 on 8158  Progress: 4580 on 8158  Progress: 4581 on 8158  Progress: 4582 on 8158  Progress: 4583 on 8158  Progress: 4584 on 8158  Progress: 4585 on 8158  Progress: 4586 on 8158  Progress: 4587 on 8158  Progress: 4588 on 8158  Progress: 4589 on 8158  Progress: 4590 on 8158  Progress: 4591 on 8158  Progress: 4592 on 8158  Progress: 4593 on 8158  Progress: 4594 on 8158  Progress: 4595 on 8158  Progress: 4596 on 8158  Progress: 4597 on 8158  Progress: 4598 on 8158  Progress: 4599 on 8158  Progress: 4600 on 8158  Progress: 4601 on 8158  Progress: 4602 on 8158  Progress: 4603 on 8158  Progress: 4604 on 8158  Progress: 4605 on 8158  Progress: 4606 on 8158  Progress: 4607 on 8158  Progress: 4608 on 8158  Progress: 4609 on 8158  Progress: 4610 on 8158  Progress: 4611 on 8158  Progress: 4612 on 8158  Progress: 4613 on 8158  Progress: 4614 on 8158  Progress: 4615 on 8158  Progress: 4616 on 8158  Progress: 4617 on 8158  Progress: 4618 on 8158  Progress: 4619 on 8158  Progress: 4620 on 8158  Progress: 4621 on 8158  Progress: 4622 on 8158  Progress: 4623 on 8158  Progress: 4624 on 8158  Progress: 4625 on 8158  Progress: 4626 on 8158  Progress: 4627 on 8158  Progress: 4628 on 8158  Progress: 4629 on 8158  Progress: 4630 on 8158  Progress: 4631 on 8158  Progress: 4632 on 8158  Progress: 4633 on 8158  Progress: 4634 on 8158  Progress: 4635 on 8158  Progress: 4636 on 8158  Progress: 4637 on 8158  Progress: 4638 on 8158  Progress: 4639 on 8158  Progress: 4640 on 8158  Progress: 4641 on 8158  Progress: 4642 on 8158  Progress: 4643 on 8158  Progress: 4644 on 8158  Progress: 4645 on 8158  Progress: 4646 on 8158  Progress: 4647 on 8158  Progress: 4648 on 8158  Progress: 4649 on 8158  Progress: 4650 on 8158  Progress: 4651 on 8158  Progress: 4652 on 8158  Progress: 4653 on 8158  Progress: 4654 on 8158  Progress: 4655 on 8158  Progress: 4656 on 8158  Progress: 4657 on 8158  Progress: 4658 on 8158  Progress: 4659 on 8158  Progress: 4660 on 8158  Progress: 4661 on 8158  Progress: 4662 on 8158  Progress: 4663 on 8158  Progress: 4664 on 8158  Progress: 4665 on 8158  Progress: 4666 on 8158  Progress: 4667 on 8158  Progress: 4668 on 8158  Progress: 4669 on 8158  Progress: 4670 on 8158  Progress: 4671 on 8158  Progress: 4672 on 8158  Progress: 4673 on 8158  Progress: 4674 on 8158  Progress: 4675 on 8158  Progress: 4676 on 8158  Progress: 4677 on 8158  Progress: 4678 on 8158  Progress: 4679 on 8158  Progress: 4680 on 8158  Progress: 4681 on 8158  Progress: 4682 on 8158  Progress: 4683 on 8158  Progress: 4684 on 8158  Progress: 4685 on 8158  Progress: 4686 on 8158  Progress: 4687 on 8158  Progress: 4688 on 8158  Progress: 4689 on 8158  Progress: 4690 on 8158  Progress: 4691 on 8158  Progress: 4692 on 8158  Progress: 4693 on 8158  Progress: 4694 on 8158  Progress: 4695 on 8158  Progress: 4696 on 8158  Progress: 4697 on 8158  Progress: 4698 on 8158  Progress: 4699 on 8158  Progress: 4700 on 8158  Progress: 4701 on 8158  Progress: 4702 on 8158  Progress: 4703 on 8158  Progress: 4704 on 8158  Progress: 4705 on 8158  Progress: 4706 on 8158  Progress: 4707 on 8158  Progress: 4708 on 8158  Progress: 4709 on 8158  Progress: 4710 on 8158  Progress: 4711 on 8158  Progress: 4712 on 8158  Progress: 4713 on 8158  Progress: 4714 on 8158  Progress: 4715 on 8158  Progress: 4716 on 8158  Progress: 4717 on 8158  Progress: 4718 on 8158  Progress: 4719 on 8158  Progress: 4720 on 8158  Progress: 4721 on 8158  Progress: 4722 on 8158  Progress: 4723 on 8158  Progress: 4724 on 8158  Progress: 4725 on 8158  Progress: 4726 on 8158  Progress: 4727 on 8158  Progress: 4728 on 8158  Progress: 4729 on 8158  Progress: 4730 on 8158  Progress: 4731 on 8158  Progress: 4732 on 8158  Progress: 4733 on 8158  Progress: 4734 on 8158  Progress: 4735 on 8158  Progress: 4736 on 8158  Progress: 4737 on 8158  Progress: 4738 on 8158  Progress: 4739 on 8158  Progress: 4740 on 8158  Progress: 4741 on 8158  Progress: 4742 on 8158  Progress: 4743 on 8158  Progress: 4744 on 8158  Progress: 4745 on 8158  Progress: 4746 on 8158  Progress: 4747 on 8158  Progress: 4748 on 8158  Progress: 4749 on 8158  Progress: 4750 on 8158  Progress: 4751 on 8158  Progress: 4752 on 8158  Progress: 4753 on 8158  Progress: 4754 on 8158  Progress: 4755 on 8158  Progress: 4756 on 8158  Progress: 4757 on 8158  Progress: 4758 on 8158  Progress: 4759 on 8158  Progress: 4760 on 8158  Progress: 4761 on 8158  Progress: 4762 on 8158  Progress: 4763 on 8158  Progress: 4764 on 8158  Progress: 4765 on 8158  Progress: 4766 on 8158  Progress: 4767 on 8158  Progress: 4768 on 8158  Progress: 4769 on 8158  Progress: 4770 on 8158  Progress: 4771 on 8158  Progress: 4772 on 8158  Progress: 4773 on 8158  Progress: 4774 on 8158  Progress: 4775 on 8158  Progress: 4776 on 8158  Progress: 4777 on 8158  Progress: 4778 on 8158  Progress: 4779 on 8158  Progress: 4780 on 8158  Progress: 4781 on 8158  Progress: 4782 on 8158  Progress: 4783 on 8158  Progress: 4784 on 8158  Progress: 4785 on 8158  Progress: 4786 on 8158  Progress: 4787 on 8158  Progress: 4788 on 8158  Progress: 4789 on 8158  Progress: 4790 on 8158  Progress: 4791 on 8158  Progress: 4792 on 8158  Progress: 4793 on 8158  Progress: 4794 on 8158  Progress: 4795 on 8158  Progress: 4796 on 8158  Progress: 4797 on 8158  Progress: 4798 on 8158  Progress: 4799 on 8158  Progress: 4800 on 8158  Progress: 4801 on 8158  Progress: 4802 on 8158  Progress: 4803 on 8158  Progress: 4804 on 8158  Progress: 4805 on 8158  Progress: 4806 on 8158  Progress: 4807 on 8158  Progress: 4808 on 8158  Progress: 4809 on 8158  Progress: 4810 on 8158  Progress: 4811 on 8158  Progress: 4812 on 8158  Progress: 4813 on 8158  Progress: 4814 on 8158  Progress: 4815 on 8158  Progress: 4816 on 8158  Progress: 4817 on 8158  Progress: 4818 on 8158  Progress: 4819 on 8158  Progress: 4820 on 8158  Progress: 4821 on 8158  Progress: 4822 on 8158  Progress: 4823 on 8158  Progress: 4824 on 8158  Progress: 4825 on 8158  Progress: 4826 on 8158  Progress: 4827 on 8158  Progress: 4828 on 8158  Progress: 4829 on 8158  Progress: 4830 on 8158  Progress: 4831 on 8158  Progress: 4832 on 8158  Progress: 4833 on 8158  Progress: 4834 on 8158  Progress: 4835 on 8158  Progress: 4836 on 8158  Progress: 4837 on 8158  Progress: 4838 on 8158  Progress: 4839 on 8158  Progress: 4840 on 8158  Progress: 4841 on 8158  Progress: 4842 on 8158  Progress: 4843 on 8158  Progress: 4844 on 8158  Progress: 4845 on 8158  Progress: 4846 on 8158  Progress: 4847 on 8158  Progress: 4848 on 8158  Progress: 4849 on 8158  Progress: 4850 on 8158  Progress: 4851 on 8158  Progress: 4852 on 8158  Progress: 4853 on 8158  Progress: 4854 on 8158  Progress: 4855 on 8158  Progress: 4856 on 8158  Progress: 4857 on 8158  Progress: 4858 on 8158  Progress: 4859 on 8158  Progress: 4860 on 8158  Progress: 4861 on 8158  Progress: 4862 on 8158  Progress: 4863 on 8158  Progress: 4864 on 8158  Progress: 4865 on 8158  Progress: 4866 on 8158  Progress: 4867 on 8158  Progress: 4868 on 8158  Progress: 4869 on 8158  Progress: 4870 on 8158  Progress: 4871 on 8158  Progress: 4872 on 8158  Progress: 4873 on 8158  Progress: 4874 on 8158  Progress: 4875 on 8158  Progress: 4876 on 8158  Progress: 4877 on 8158  Progress: 4878 on 8158  Progress: 4879 on 8158  Progress: 4880 on 8158  Progress: 4881 on 8158  Progress: 4882 on 8158  Progress: 4883 on 8158  Progress: 4884 on 8158  Progress: 4885 on 8158  Progress: 4886 on 8158  Progress: 4887 on 8158  Progress: 4888 on 8158  Progress: 4889 on 8158  Progress: 4890 on 8158  Progress: 4891 on 8158  Progress: 4892 on 8158  Progress: 4893 on 8158  Progress: 4894 on 8158  Progress: 4895 on 8158  Progress: 4896 on 8158  Progress: 4897 on 8158  Progress: 4898 on 8158  Progress: 4899 on 8158  Progress: 4900 on 8158  Progress: 4901 on 8158  Progress: 4902 on 8158  Progress: 4903 on 8158  Progress: 4904 on 8158  Progress: 4905 on 8158  Progress: 4906 on 8158  Progress: 4907 on 8158  Progress: 4908 on 8158  Progress: 4909 on 8158  Progress: 4910 on 8158  Progress: 4911 on 8158  Progress: 4912 on 8158  Progress: 4913 on 8158  Progress: 4914 on 8158  Progress: 4915 on 8158  Progress: 4916 on 8158  Progress: 4917 on 8158  Progress: 4918 on 8158  Progress: 4919 on 8158  Progress: 4920 on 8158  Progress: 4921 on 8158  Progress: 4922 on 8158  Progress: 4923 on 8158  Progress: 4924 on 8158  Progress: 4925 on 8158  Progress: 4926 on 8158  Progress: 4927 on 8158  Progress: 4928 on 8158  Progress: 4929 on 8158  Progress: 4930 on 8158  Progress: 4931 on 8158  Progress: 4932 on 8158  Progress: 4933 on 8158  Progress: 4934 on 8158  Progress: 4935 on 8158  Progress: 4936 on 8158  Progress: 4937 on 8158  Progress: 4938 on 8158  Progress: 4939 on 8158  Progress: 4940 on 8158  Progress: 4941 on 8158  Progress: 4942 on 8158  Progress: 4943 on 8158  Progress: 4944 on 8158  Progress: 4945 on 8158  Progress: 4946 on 8158  Progress: 4947 on 8158  Progress: 4948 on 8158  Progress: 4949 on 8158  Progress: 4950 on 8158  Progress: 4951 on 8158  Progress: 4952 on 8158  Progress: 4953 on 8158  Progress: 4954 on 8158  Progress: 4955 on 8158  Progress: 4956 on 8158  Progress: 4957 on 8158  Progress: 4958 on 8158  Progress: 4959 on 8158  Progress: 4960 on 8158  Progress: 4961 on 8158  Progress: 4962 on 8158  Progress: 4963 on 8158  Progress: 4964 on 8158  Progress: 4965 on 8158  Progress: 4966 on 8158  Progress: 4967 on 8158  Progress: 4968 on 8158  Progress: 4969 on 8158  Progress: 4970 on 8158  Progress: 4971 on 8158  Progress: 4972 on 8158  Progress: 4973 on 8158  Progress: 4974 on 8158  Progress: 4975 on 8158  Progress: 4976 on 8158  Progress: 4977 on 8158  Progress: 4978 on 8158  Progress: 4979 on 8158  Progress: 4980 on 8158  Progress: 4981 on 8158  Progress: 4982 on 8158  Progress: 4983 on 8158  Progress: 4984 on 8158  Progress: 4985 on 8158  Progress: 4986 on 8158  Progress: 4987 on 8158  Progress: 4988 on 8158  Progress: 4989 on 8158  Progress: 4990 on 8158  Progress: 4991 on 8158  Progress: 4992 on 8158  Progress: 4993 on 8158  Progress: 4994 on 8158  Progress: 4995 on 8158  Progress: 4996 on 8158  Progress: 4997 on 8158  Progress: 4998 on 8158  Progress: 4999 on 8158  Progress: 5000 on 8158  Progress: 5001 on 8158  Progress: 5002 on 8158  Progress: 5003 on 8158  Progress: 5004 on 8158  Progress: 5005 on 8158  Progress: 5006 on 8158  Progress: 5007 on 8158  Progress: 5008 on 8158  Progress: 5009 on 8158  Progress: 5010 on 8158  Progress: 5011 on 8158  Progress: 5012 on 8158  Progress: 5013 on 8158  Progress: 5014 on 8158  Progress: 5015 on 8158  Progress: 5016 on 8158  Progress: 5017 on 8158  Progress: 5018 on 8158  Progress: 5019 on 8158  Progress: 5020 on 8158  Progress: 5021 on 8158  Progress: 5022 on 8158  Progress: 5023 on 8158  Progress: 5024 on 8158  Progress: 5025 on 8158  Progress: 5026 on 8158  Progress: 5027 on 8158  Progress: 5028 on 8158  Progress: 5029 on 8158  Progress: 5030 on 8158  Progress: 5031 on 8158  Progress: 5032 on 8158  Progress: 5033 on 8158  Progress: 5034 on 8158  Progress: 5035 on 8158  Progress: 5036 on 8158  Progress: 5037 on 8158  Progress: 5038 on 8158  Progress: 5039 on 8158  Progress: 5040 on 8158  Progress: 5041 on 8158  Progress: 5042 on 8158  Progress: 5043 on 8158  Progress: 5044 on 8158  Progress: 5045 on 8158  Progress: 5046 on 8158  Progress: 5047 on 8158  Progress: 5048 on 8158  Progress: 5049 on 8158  Progress: 5050 on 8158  Progress: 5051 on 8158  Progress: 5052 on 8158  Progress: 5053 on 8158  Progress: 5054 on 8158  Progress: 5055 on 8158  Progress: 5056 on 8158  Progress: 5057 on 8158  Progress: 5058 on 8158  Progress: 5059 on 8158  Progress: 5060 on 8158  Progress: 5061 on 8158  Progress: 5062 on 8158  Progress: 5063 on 8158  Progress: 5064 on 8158  Progress: 5065 on 8158  Progress: 5066 on 8158  Progress: 5067 on 8158  Progress: 5068 on 8158  Progress: 5069 on 8158  Progress: 5070 on 8158  Progress: 5071 on 8158  Progress: 5072 on 8158  Progress: 5073 on 8158  Progress: 5074 on 8158  Progress: 5075 on 8158  Progress: 5076 on 8158  Progress: 5077 on 8158  Progress: 5078 on 8158  Progress: 5079 on 8158  Progress: 5080 on 8158  Progress: 5081 on 8158  Progress: 5082 on 8158  Progress: 5083 on 8158  Progress: 5084 on 8158  Progress: 5085 on 8158  Progress: 5086 on 8158  Progress: 5087 on 8158  Progress: 5088 on 8158  Progress: 5089 on 8158  Progress: 5090 on 8158  Progress: 5091 on 8158  Progress: 5092 on 8158  Progress: 5093 on 8158  Progress: 5094 on 8158  Progress: 5095 on 8158  Progress: 5096 on 8158  Progress: 5097 on 8158  Progress: 5098 on 8158  Progress: 5099 on 8158  Progress: 5100 on 8158  Progress: 5101 on 8158  Progress: 5102 on 8158  Progress: 5103 on 8158  Progress: 5104 on 8158  Progress: 5105 on 8158  Progress: 5106 on 8158  Progress: 5107 on 8158  Progress: 5108 on 8158  Progress: 5109 on 8158  Progress: 5110 on 8158  Progress: 5111 on 8158  Progress: 5112 on 8158  Progress: 5113 on 8158  Progress: 5114 on 8158  Progress: 5115 on 8158  Progress: 5116 on 8158  Progress: 5117 on 8158  Progress: 5118 on 8158  Progress: 5119 on 8158  Progress: 5120 on 8158  Progress: 5121 on 8158  Progress: 5122 on 8158  Progress: 5123 on 8158  Progress: 5124 on 8158  Progress: 5125 on 8158  Progress: 5126 on 8158  Progress: 5127 on 8158  Progress: 5128 on 8158  Progress: 5129 on 8158  Progress: 5130 on 8158  Progress: 5131 on 8158  Progress: 5132 on 8158  Progress: 5133 on 8158  Progress: 5134 on 8158  Progress: 5135 on 8158  Progress: 5136 on 8158  Progress: 5137 on 8158  Progress: 5138 on 8158  Progress: 5139 on 8158  Progress: 5140 on 8158  Progress: 5141 on 8158  Progress: 5142 on 8158  Progress: 5143 on 8158  Progress: 5144 on 8158  Progress: 5145 on 8158  Progress: 5146 on 8158  Progress: 5147 on 8158  Progress: 5148 on 8158  Progress: 5149 on 8158  Progress: 5150 on 8158  Progress: 5151 on 8158  Progress: 5152 on 8158  Progress: 5153 on 8158  Progress: 5154 on 8158  Progress: 5155 on 8158  Progress: 5156 on 8158  Progress: 5157 on 8158  Progress: 5158 on 8158  Progress: 5159 on 8158  Progress: 5160 on 8158  Progress: 5161 on 8158  Progress: 5162 on 8158  Progress: 5163 on 8158  Progress: 5164 on 8158  Progress: 5165 on 8158  Progress: 5166 on 8158  Progress: 5167 on 8158  Progress: 5168 on 8158  Progress: 5169 on 8158  Progress: 5170 on 8158  Progress: 5171 on 8158  Progress: 5172 on 8158  Progress: 5173 on 8158  Progress: 5174 on 8158  Progress: 5175 on 8158  Progress: 5176 on 8158  Progress: 5177 on 8158  Progress: 5178 on 8158  Progress: 5179 on 8158  Progress: 5180 on 8158  Progress: 5181 on 8158  Progress: 5182 on 8158  Progress: 5183 on 8158  Progress: 5184 on 8158  Progress: 5185 on 8158  Progress: 5186 on 8158  Progress: 5187 on 8158  Progress: 5188 on 8158  Progress: 5189 on 8158  Progress: 5190 on 8158  Progress: 5191 on 8158  Progress: 5192 on 8158  Progress: 5193 on 8158  Progress: 5194 on 8158  Progress: 5195 on 8158  Progress: 5196 on 8158  Progress: 5197 on 8158  Progress: 5198 on 8158  Progress: 5199 on 8158  Progress: 5200 on 8158  Progress: 5201 on 8158  Progress: 5202 on 8158  Progress: 5203 on 8158  Progress: 5204 on 8158  Progress: 5205 on 8158  Progress: 5206 on 8158  Progress: 5207 on 8158  Progress: 5208 on 8158  Progress: 5209 on 8158  Progress: 5210 on 8158  Progress: 5211 on 8158  Progress: 5212 on 8158  Progress: 5213 on 8158  Progress: 5214 on 8158  Progress: 5215 on 8158  Progress: 5216 on 8158  Progress: 5217 on 8158  Progress: 5218 on 8158  Progress: 5219 on 8158  Progress: 5220 on 8158  Progress: 5221 on 8158  Progress: 5222 on 8158  Progress: 5223 on 8158  Progress: 5224 on 8158  Progress: 5225 on 8158  Progress: 5226 on 8158  Progress: 5227 on 8158  Progress: 5228 on 8158  Progress: 5229 on 8158  Progress: 5230 on 8158  Progress: 5231 on 8158  Progress: 5232 on 8158  Progress: 5233 on 8158  Progress: 5234 on 8158  Progress: 5235 on 8158  Progress: 5236 on 8158  Progress: 5237 on 8158  Progress: 5238 on 8158  Progress: 5239 on 8158  Progress: 5240 on 8158  Progress: 5241 on 8158  Progress: 5242 on 8158  Progress: 5243 on 8158  Progress: 5244 on 8158  Progress: 5245 on 8158  Progress: 5246 on 8158  Progress: 5247 on 8158  Progress: 5248 on 8158  Progress: 5249 on 8158  Progress: 5250 on 8158  Progress: 5251 on 8158  Progress: 5252 on 8158  Progress: 5253 on 8158  Progress: 5254 on 8158  Progress: 5255 on 8158  Progress: 5256 on 8158  Progress: 5257 on 8158  Progress: 5258 on 8158  Progress: 5259 on 8158  Progress: 5260 on 8158  Progress: 5261 on 8158  Progress: 5262 on 8158  Progress: 5263 on 8158  Progress: 5264 on 8158  Progress: 5265 on 8158  Progress: 5266 on 8158  Progress: 5267 on 8158  Progress: 5268 on 8158  Progress: 5269 on 8158  Progress: 5270 on 8158  Progress: 5271 on 8158  Progress: 5272 on 8158  Progress: 5273 on 8158  Progress: 5274 on 8158  Progress: 5275 on 8158  Progress: 5276 on 8158  Progress: 5277 on 8158  Progress: 5278 on 8158  Progress: 5279 on 8158  Progress: 5280 on 8158  Progress: 5281 on 8158  Progress: 5282 on 8158  Progress: 5283 on 8158  Progress: 5284 on 8158  Progress: 5285 on 8158  Progress: 5286 on 8158  Progress: 5287 on 8158  Progress: 5288 on 8158  Progress: 5289 on 8158  Progress: 5290 on 8158  Progress: 5291 on 8158  Progress: 5292 on 8158  Progress: 5293 on 8158  Progress: 5294 on 8158  Progress: 5295 on 8158  Progress: 5296 on 8158  Progress: 5297 on 8158  Progress: 5298 on 8158  Progress: 5299 on 8158  Progress: 5300 on 8158  Progress: 5301 on 8158  Progress: 5302 on 8158  Progress: 5303 on 8158  Progress: 5304 on 8158  Progress: 5305 on 8158  Progress: 5306 on 8158  Progress: 5307 on 8158  Progress: 5308 on 8158  Progress: 5309 on 8158  Progress: 5310 on 8158  Progress: 5311 on 8158  Progress: 5312 on 8158  Progress: 5313 on 8158  Progress: 5314 on 8158  Progress: 5315 on 8158  Progress: 5316 on 8158  Progress: 5317 on 8158  Progress: 5318 on 8158  Progress: 5319 on 8158  Progress: 5320 on 8158  Progress: 5321 on 8158  Progress: 5322 on 8158  Progress: 5323 on 8158  Progress: 5324 on 8158  Progress: 5325 on 8158  Progress: 5326 on 8158  Progress: 5327 on 8158  Progress: 5328 on 8158  Progress: 5329 on 8158  Progress: 5330 on 8158  Progress: 5331 on 8158  Progress: 5332 on 8158  Progress: 5333 on 8158  Progress: 5334 on 8158  Progress: 5335 on 8158  Progress: 5336 on 8158  Progress: 5337 on 8158  Progress: 5338 on 8158  Progress: 5339 on 8158  Progress: 5340 on 8158  Progress: 5341 on 8158  Progress: 5342 on 8158  Progress: 5343 on 8158  Progress: 5344 on 8158  Progress: 5345 on 8158  Progress: 5346 on 8158  Progress: 5347 on 8158  Progress: 5348 on 8158  Progress: 5349 on 8158  Progress: 5350 on 8158  Progress: 5351 on 8158  Progress: 5352 on 8158  Progress: 5353 on 8158  Progress: 5354 on 8158  Progress: 5355 on 8158  Progress: 5356 on 8158  Progress: 5357 on 8158  Progress: 5358 on 8158  Progress: 5359 on 8158  Progress: 5360 on 8158  Progress: 5361 on 8158  Progress: 5362 on 8158  Progress: 5363 on 8158  Progress: 5364 on 8158  Progress: 5365 on 8158  Progress: 5366 on 8158  Progress: 5367 on 8158  Progress: 5368 on 8158  Progress: 5369 on 8158  Progress: 5370 on 8158  Progress: 5371 on 8158  Progress: 5372 on 8158  Progress: 5373 on 8158  Progress: 5374 on 8158  Progress: 5375 on 8158  Progress: 5376 on 8158  Progress: 5377 on 8158  Progress: 5378 on 8158  Progress: 5379 on 8158  Progress: 5380 on 8158  Progress: 5381 on 8158  Progress: 5382 on 8158  Progress: 5383 on 8158  Progress: 5384 on 8158  Progress: 5385 on 8158  Progress: 5386 on 8158  Progress: 5387 on 8158  Progress: 5388 on 8158  Progress: 5389 on 8158  Progress: 5390 on 8158  Progress: 5391 on 8158  Progress: 5392 on 8158  Progress: 5393 on 8158  Progress: 5394 on 8158  Progress: 5395 on 8158  Progress: 5396 on 8158  Progress: 5397 on 8158  Progress: 5398 on 8158  Progress: 5399 on 8158  Progress: 5400 on 8158  Progress: 5401 on 8158  Progress: 5402 on 8158  Progress: 5403 on 8158  Progress: 5404 on 8158  Progress: 5405 on 8158  Progress: 5406 on 8158  Progress: 5407 on 8158  Progress: 5408 on 8158  Progress: 5409 on 8158  Progress: 5410 on 8158  Progress: 5411 on 8158  Progress: 5412 on 8158  Progress: 5413 on 8158  Progress: 5414 on 8158  Progress: 5415 on 8158  Progress: 5416 on 8158  Progress: 5417 on 8158  Progress: 5418 on 8158  Progress: 5419 on 8158  Progress: 5420 on 8158  Progress: 5421 on 8158  Progress: 5422 on 8158  Progress: 5423 on 8158  Progress: 5424 on 8158  Progress: 5425 on 8158  Progress: 5426 on 8158  Progress: 5427 on 8158  Progress: 5428 on 8158  Progress: 5429 on 8158  Progress: 5430 on 8158  Progress: 5431 on 8158  Progress: 5432 on 8158  Progress: 5433 on 8158  Progress: 5434 on 8158  Progress: 5435 on 8158  Progress: 5436 on 8158  Progress: 5437 on 8158  Progress: 5438 on 8158  Progress: 5439 on 8158  Progress: 5440 on 8158  Progress: 5441 on 8158  Progress: 5442 on 8158  Progress: 5443 on 8158  Progress: 5444 on 8158  Progress: 5445 on 8158  Progress: 5446 on 8158  Progress: 5447 on 8158  Progress: 5448 on 8158  Progress: 5449 on 8158  Progress: 5450 on 8158  Progress: 5451 on 8158  Progress: 5452 on 8158  Progress: 5453 on 8158  Progress: 5454 on 8158  Progress: 5455 on 8158  Progress: 5456 on 8158  Progress: 5457 on 8158  Progress: 5458 on 8158  Progress: 5459 on 8158  Progress: 5460 on 8158  Progress: 5461 on 8158  Progress: 5462 on 8158  Progress: 5463 on 8158  Progress: 5464 on 8158  Progress: 5465 on 8158  Progress: 5466 on 8158  Progress: 5467 on 8158  Progress: 5468 on 8158  Progress: 5469 on 8158  Progress: 5470 on 8158  Progress: 5471 on 8158  Progress: 5472 on 8158  Progress: 5473 on 8158  Progress: 5474 on 8158  Progress: 5475 on 8158  Progress: 5476 on 8158  Progress: 5477 on 8158  Progress: 5478 on 8158  Progress: 5479 on 8158  Progress: 5480 on 8158  Progress: 5481 on 8158  Progress: 5482 on 8158  Progress: 5483 on 8158  Progress: 5484 on 8158  Progress: 5485 on 8158  Progress: 5486 on 8158  Progress: 5487 on 8158  Progress: 5488 on 8158  Progress: 5489 on 8158  Progress: 5490 on 8158  Progress: 5491 on 8158  Progress: 5492 on 8158  Progress: 5493 on 8158  Progress: 5494 on 8158  Progress: 5495 on 8158  Progress: 5496 on 8158  Progress: 5497 on 8158  Progress: 5498 on 8158  Progress: 5499 on 8158  Progress: 5500 on 8158  Progress: 5501 on 8158  Progress: 5502 on 8158  Progress: 5503 on 8158  Progress: 5504 on 8158  Progress: 5505 on 8158  Progress: 5506 on 8158  Progress: 5507 on 8158  Progress: 5508 on 8158  Progress: 5509 on 8158  Progress: 5510 on 8158  Progress: 5511 on 8158  Progress: 5512 on 8158  Progress: 5513 on 8158  Progress: 5514 on 8158  Progress: 5515 on 8158  Progress: 5516 on 8158  Progress: 5517 on 8158  Progress: 5518 on 8158  Progress: 5519 on 8158  Progress: 5520 on 8158  Progress: 5521 on 8158  Progress: 5522 on 8158  Progress: 5523 on 8158  Progress: 5524 on 8158  Progress: 5525 on 8158  Progress: 5526 on 8158  Progress: 5527 on 8158  Progress: 5528 on 8158  Progress: 5529 on 8158  Progress: 5530 on 8158  Progress: 5531 on 8158  Progress: 5532 on 8158  Progress: 5533 on 8158  Progress: 5534 on 8158  Progress: 5535 on 8158  Progress: 5536 on 8158  Progress: 5537 on 8158  Progress: 5538 on 8158  Progress: 5539 on 8158  Progress: 5540 on 8158  Progress: 5541 on 8158  Progress: 5542 on 8158  Progress: 5543 on 8158  Progress: 5544 on 8158  Progress: 5545 on 8158  Progress: 5546 on 8158  Progress: 5547 on 8158  Progress: 5548 on 8158  Progress: 5549 on 8158  Progress: 5550 on 8158  Progress: 5551 on 8158  Progress: 5552 on 8158  Progress: 5553 on 8158  Progress: 5554 on 8158  Progress: 5555 on 8158  Progress: 5556 on 8158  Progress: 5557 on 8158  Progress: 5558 on 8158  Progress: 5559 on 8158  Progress: 5560 on 8158  Progress: 5561 on 8158  Progress: 5562 on 8158  Progress: 5563 on 8158  Progress: 5564 on 8158  Progress: 5565 on 8158  Progress: 5566 on 8158  Progress: 5567 on 8158  Progress: 5568 on 8158  Progress: 5569 on 8158  Progress: 5570 on 8158  Progress: 5571 on 8158  Progress: 5572 on 8158  Progress: 5573 on 8158  Progress: 5574 on 8158  Progress: 5575 on 8158  Progress: 5576 on 8158  Progress: 5577 on 8158  Progress: 5578 on 8158  Progress: 5579 on 8158  Progress: 5580 on 8158  Progress: 5581 on 8158  Progress: 5582 on 8158  Progress: 5583 on 8158  Progress: 5584 on 8158  Progress: 5585 on 8158  Progress: 5586 on 8158  Progress: 5587 on 8158  Progress: 5588 on 8158  Progress: 5589 on 8158  Progress: 5590 on 8158  Progress: 5591 on 8158  Progress: 5592 on 8158  Progress: 5593 on 8158  Progress: 5594 on 8158  Progress: 5595 on 8158  Progress: 5596 on 8158  Progress: 5597 on 8158  Progress: 5598 on 8158  Progress: 5599 on 8158  Progress: 5600 on 8158  Progress: 5601 on 8158  Progress: 5602 on 8158  Progress: 5603 on 8158  Progress: 5604 on 8158  Progress: 5605 on 8158  Progress: 5606 on 8158  Progress: 5607 on 8158  Progress: 5608 on 8158  Progress: 5609 on 8158  Progress: 5610 on 8158  Progress: 5611 on 8158  Progress: 5612 on 8158  Progress: 5613 on 8158  Progress: 5614 on 8158  Progress: 5615 on 8158  Progress: 5616 on 8158  Progress: 5617 on 8158  Progress: 5618 on 8158  Progress: 5619 on 8158  Progress: 5620 on 8158  Progress: 5621 on 8158  Progress: 5622 on 8158  Progress: 5623 on 8158  Progress: 5624 on 8158  Progress: 5625 on 8158  Progress: 5626 on 8158  Progress: 5627 on 8158  Progress: 5628 on 8158  Progress: 5629 on 8158  Progress: 5630 on 8158  Progress: 5631 on 8158  Progress: 5632 on 8158  Progress: 5633 on 8158  Progress: 5634 on 8158  Progress: 5635 on 8158  Progress: 5636 on 8158  Progress: 5637 on 8158  Progress: 5638 on 8158  Progress: 5639 on 8158  Progress: 5640 on 8158  Progress: 5641 on 8158  Progress: 5642 on 8158  Progress: 5643 on 8158  Progress: 5644 on 8158  Progress: 5645 on 8158  Progress: 5646 on 8158  Progress: 5647 on 8158  Progress: 5648 on 8158  Progress: 5649 on 8158  Progress: 5650 on 8158  Progress: 5651 on 8158  Progress: 5652 on 8158  Progress: 5653 on 8158  Progress: 5654 on 8158  Progress: 5655 on 8158  Progress: 5656 on 8158  Progress: 5657 on 8158  Progress: 5658 on 8158  Progress: 5659 on 8158  Progress: 5660 on 8158  Progress: 5661 on 8158  Progress: 5662 on 8158  Progress: 5663 on 8158  Progress: 5664 on 8158  Progress: 5665 on 8158  Progress: 5666 on 8158  Progress: 5667 on 8158  Progress: 5668 on 8158  Progress: 5669 on 8158  Progress: 5670 on 8158  Progress: 5671 on 8158  Progress: 5672 on 8158  Progress: 5673 on 8158  Progress: 5674 on 8158  Progress: 5675 on 8158  Progress: 5676 on 8158  Progress: 5677 on 8158  Progress: 5678 on 8158  Progress: 5679 on 8158  Progress: 5680 on 8158  Progress: 5681 on 8158  Progress: 5682 on 8158  Progress: 5683 on 8158  Progress: 5684 on 8158  Progress: 5685 on 8158  Progress: 5686 on 8158  Progress: 5687 on 8158  Progress: 5688 on 8158  Progress: 5689 on 8158  Progress: 5690 on 8158  Progress: 5691 on 8158  Progress: 5692 on 8158  Progress: 5693 on 8158  Progress: 5694 on 8158  Progress: 5695 on 8158  Progress: 5696 on 8158  Progress: 5697 on 8158  Progress: 5698 on 8158  Progress: 5699 on 8158  Progress: 5700 on 8158  Progress: 5701 on 8158  Progress: 5702 on 8158  Progress: 5703 on 8158  Progress: 5704 on 8158  Progress: 5705 on 8158  Progress: 5706 on 8158  Progress: 5707 on 8158  Progress: 5708 on 8158  Progress: 5709 on 8158  Progress: 5710 on 8158  Progress: 5711 on 8158  Progress: 5712 on 8158  Progress: 5713 on 8158  Progress: 5714 on 8158  Progress: 5715 on 8158  Progress: 5716 on 8158  Progress: 5717 on 8158  Progress: 5718 on 8158  Progress: 5719 on 8158  Progress: 5720 on 8158  Progress: 5721 on 8158  Progress: 5722 on 8158  Progress: 5723 on 8158  Progress: 5724 on 8158  Progress: 5725 on 8158  Progress: 5726 on 8158  Progress: 5727 on 8158  Progress: 5728 on 8158  Progress: 5729 on 8158  Progress: 5730 on 8158  Progress: 5731 on 8158  Progress: 5732 on 8158  Progress: 5733 on 8158  Progress: 5734 on 8158  Progress: 5735 on 8158  Progress: 5736 on 8158  Progress: 5737 on 8158  Progress: 5738 on 8158  Progress: 5739 on 8158  Progress: 5740 on 8158  Progress: 5741 on 8158  Progress: 5742 on 8158  Progress: 5743 on 8158  Progress: 5744 on 8158  Progress: 5745 on 8158  Progress: 5746 on 8158  Progress: 5747 on 8158  Progress: 5748 on 8158  Progress: 5749 on 8158  Progress: 5750 on 8158  Progress: 5751 on 8158  Progress: 5752 on 8158  Progress: 5753 on 8158  Progress: 5754 on 8158  Progress: 5755 on 8158  Progress: 5756 on 8158  Progress: 5757 on 8158  Progress: 5758 on 8158  Progress: 5759 on 8158  Progress: 5760 on 8158  Progress: 5761 on 8158  Progress: 5762 on 8158  Progress: 5763 on 8158  Progress: 5764 on 8158  Progress: 5765 on 8158  Progress: 5766 on 8158  Progress: 5767 on 8158  Progress: 5768 on 8158  Progress: 5769 on 8158  Progress: 5770 on 8158  Progress: 5771 on 8158  Progress: 5772 on 8158  Progress: 5773 on 8158  Progress: 5774 on 8158  Progress: 5775 on 8158  Progress: 5776 on 8158  Progress: 5777 on 8158  Progress: 5778 on 8158  Progress: 5779 on 8158  Progress: 5780 on 8158  Progress: 5781 on 8158  Progress: 5782 on 8158  Progress: 5783 on 8158  Progress: 5784 on 8158  Progress: 5785 on 8158  Progress: 5786 on 8158  Progress: 5787 on 8158  Progress: 5788 on 8158  Progress: 5789 on 8158  Progress: 5790 on 8158  Progress: 5791 on 8158  Progress: 5792 on 8158  Progress: 5793 on 8158  Progress: 5794 on 8158  Progress: 5795 on 8158  Progress: 5796 on 8158  Progress: 5797 on 8158  Progress: 5798 on 8158  Progress: 5799 on 8158  Progress: 5800 on 8158  Progress: 5801 on 8158  Progress: 5802 on 8158  Progress: 5803 on 8158  Progress: 5804 on 8158  Progress: 5805 on 8158  Progress: 5806 on 8158  Progress: 5807 on 8158  Progress: 5808 on 8158  Progress: 5809 on 8158  Progress: 5810 on 8158  Progress: 5811 on 8158  Progress: 5812 on 8158  Progress: 5813 on 8158  Progress: 5814 on 8158  Progress: 5815 on 8158  Progress: 5816 on 8158  Progress: 5817 on 8158  Progress: 5818 on 8158  Progress: 5819 on 8158  Progress: 5820 on 8158  Progress: 5821 on 8158  Progress: 5822 on 8158  Progress: 5823 on 8158  Progress: 5824 on 8158  Progress: 5825 on 8158  Progress: 5826 on 8158  Progress: 5827 on 8158  Progress: 5828 on 8158  Progress: 5829 on 8158  Progress: 5830 on 8158  Progress: 5831 on 8158  Progress: 5832 on 8158  Progress: 5833 on 8158  Progress: 5834 on 8158  Progress: 5835 on 8158  Progress: 5836 on 8158  Progress: 5837 on 8158  Progress: 5838 on 8158  Progress: 5839 on 8158  Progress: 5840 on 8158  Progress: 5841 on 8158  Progress: 5842 on 8158  Progress: 5843 on 8158  Progress: 5844 on 8158  Progress: 5845 on 8158  Progress: 5846 on 8158  Progress: 5847 on 8158  Progress: 5848 on 8158  Progress: 5849 on 8158  Progress: 5850 on 8158  Progress: 5851 on 8158  Progress: 5852 on 8158  Progress: 5853 on 8158  Progress: 5854 on 8158  Progress: 5855 on 8158  Progress: 5856 on 8158  Progress: 5857 on 8158  Progress: 5858 on 8158  Progress: 5859 on 8158  Progress: 5860 on 8158  Progress: 5861 on 8158  Progress: 5862 on 8158  Progress: 5863 on 8158  Progress: 5864 on 8158  Progress: 5865 on 8158  Progress: 5866 on 8158  Progress: 5867 on 8158  Progress: 5868 on 8158  Progress: 5869 on 8158  Progress: 5870 on 8158  Progress: 5871 on 8158  Progress: 5872 on 8158  Progress: 5873 on 8158  Progress: 5874 on 8158  Progress: 5875 on 8158  Progress: 5876 on 8158  Progress: 5877 on 8158  Progress: 5878 on 8158  Progress: 5879 on 8158  Progress: 5880 on 8158  Progress: 5881 on 8158  Progress: 5882 on 8158  Progress: 5883 on 8158  Progress: 5884 on 8158  Progress: 5885 on 8158  Progress: 5886 on 8158  Progress: 5887 on 8158  Progress: 5888 on 8158  Progress: 5889 on 8158  Progress: 5890 on 8158  Progress: 5891 on 8158  Progress: 5892 on 8158  Progress: 5893 on 8158  Progress: 5894 on 8158  Progress: 5895 on 8158  Progress: 5896 on 8158  Progress: 5897 on 8158  Progress: 5898 on 8158  Progress: 5899 on 8158  Progress: 5900 on 8158  Progress: 5901 on 8158  Progress: 5902 on 8158  Progress: 5903 on 8158  Progress: 5904 on 8158  Progress: 5905 on 8158  Progress: 5906 on 8158  Progress: 5907 on 8158  Progress: 5908 on 8158  Progress: 5909 on 8158  Progress: 5910 on 8158  Progress: 5911 on 8158  Progress: 5912 on 8158  Progress: 5913 on 8158  Progress: 5914 on 8158  Progress: 5915 on 8158  Progress: 5916 on 8158  Progress: 5917 on 8158  Progress: 5918 on 8158  Progress: 5919 on 8158  Progress: 5920 on 8158  Progress: 5921 on 8158  Progress: 5922 on 8158  Progress: 5923 on 8158  Progress: 5924 on 8158  Progress: 5925 on 8158  Progress: 5926 on 8158  Progress: 5927 on 8158  Progress: 5928 on 8158  Progress: 5929 on 8158  Progress: 5930 on 8158  Progress: 5931 on 8158  Progress: 5932 on 8158  Progress: 5933 on 8158  Progress: 5934 on 8158  Progress: 5935 on 8158  Progress: 5936 on 8158  Progress: 5937 on 8158  Progress: 5938 on 8158  Progress: 5939 on 8158  Progress: 5940 on 8158  Progress: 5941 on 8158  Progress: 5942 on 8158  Progress: 5943 on 8158  Progress: 5944 on 8158  Progress: 5945 on 8158  Progress: 5946 on 8158  Progress: 5947 on 8158  Progress: 5948 on 8158  Progress: 5949 on 8158  Progress: 5950 on 8158  Progress: 5951 on 8158  Progress: 5952 on 8158  Progress: 5953 on 8158  Progress: 5954 on 8158  Progress: 5955 on 8158  Progress: 5956 on 8158  Progress: 5957 on 8158  Progress: 5958 on 8158  Progress: 5959 on 8158  Progress: 5960 on 8158  Progress: 5961 on 8158  Progress: 5962 on 8158  Progress: 5963 on 8158  Progress: 5964 on 8158  Progress: 5965 on 8158  Progress: 5966 on 8158  Progress: 5967 on 8158  Progress: 5968 on 8158  Progress: 5969 on 8158  Progress: 5970 on 8158  Progress: 5971 on 8158  Progress: 5972 on 8158  Progress: 5973 on 8158  Progress: 5974 on 8158  Progress: 5975 on 8158  Progress: 5976 on 8158  Progress: 5977 on 8158  Progress: 5978 on 8158  Progress: 5979 on 8158  Progress: 5980 on 8158  Progress: 5981 on 8158  Progress: 5982 on 8158  Progress: 5983 on 8158  Progress: 5984 on 8158  Progress: 5985 on 8158  Progress: 5986 on 8158  Progress: 5987 on 8158  Progress: 5988 on 8158  Progress: 5989 on 8158  Progress: 5990 on 8158  Progress: 5991 on 8158  Progress: 5992 on 8158  Progress: 5993 on 8158  Progress: 5994 on 8158  Progress: 5995 on 8158  Progress: 5996 on 8158  Progress: 5997 on 8158  Progress: 5998 on 8158  Progress: 5999 on 8158  Progress: 6000 on 8158  Progress: 6001 on 8158  Progress: 6002 on 8158  Progress: 6003 on 8158  Progress: 6004 on 8158  Progress: 6005 on 8158  Progress: 6006 on 8158  Progress: 6007 on 8158  Progress: 6008 on 8158  Progress: 6009 on 8158  Progress: 6010 on 8158  Progress: 6011 on 8158  Progress: 6012 on 8158  Progress: 6013 on 8158  Progress: 6014 on 8158  Progress: 6015 on 8158  Progress: 6016 on 8158  Progress: 6017 on 8158  Progress: 6018 on 8158  Progress: 6019 on 8158  Progress: 6020 on 8158  Progress: 6021 on 8158  Progress: 6022 on 8158  Progress: 6023 on 8158  Progress: 6024 on 8158  Progress: 6025 on 8158  Progress: 6026 on 8158  Progress: 6027 on 8158  Progress: 6028 on 8158  Progress: 6029 on 8158  Progress: 6030 on 8158  Progress: 6031 on 8158  Progress: 6032 on 8158  Progress: 6033 on 8158  Progress: 6034 on 8158  Progress: 6035 on 8158  Progress: 6036 on 8158  Progress: 6037 on 8158  Progress: 6038 on 8158  Progress: 6039 on 8158  Progress: 6040 on 8158  Progress: 6041 on 8158  Progress: 6042 on 8158  Progress: 6043 on 8158  Progress: 6044 on 8158  Progress: 6045 on 8158  Progress: 6046 on 8158  Progress: 6047 on 8158  Progress: 6048 on 8158  Progress: 6049 on 8158  Progress: 6050 on 8158  Progress: 6051 on 8158  Progress: 6052 on 8158  Progress: 6053 on 8158  Progress: 6054 on 8158  Progress: 6055 on 8158  Progress: 6056 on 8158  Progress: 6057 on 8158  Progress: 6058 on 8158  Progress: 6059 on 8158  Progress: 6060 on 8158  Progress: 6061 on 8158  Progress: 6062 on 8158  Progress: 6063 on 8158  Progress: 6064 on 8158  Progress: 6065 on 8158  Progress: 6066 on 8158  Progress: 6067 on 8158  Progress: 6068 on 8158  Progress: 6069 on 8158  Progress: 6070 on 8158  Progress: 6071 on 8158  Progress: 6072 on 8158  Progress: 6073 on 8158  Progress: 6074 on 8158  Progress: 6075 on 8158  Progress: 6076 on 8158  Progress: 6077 on 8158  Progress: 6078 on 8158  Progress: 6079 on 8158  Progress: 6080 on 8158  Progress: 6081 on 8158  Progress: 6082 on 8158  Progress: 6083 on 8158  Progress: 6084 on 8158  Progress: 6085 on 8158  Progress: 6086 on 8158  Progress: 6087 on 8158  Progress: 6088 on 8158  Progress: 6089 on 8158  Progress: 6090 on 8158  Progress: 6091 on 8158  Progress: 6092 on 8158  Progress: 6093 on 8158  Progress: 6094 on 8158  Progress: 6095 on 8158  Progress: 6096 on 8158  Progress: 6097 on 8158  Progress: 6098 on 8158  Progress: 6099 on 8158  Progress: 6100 on 8158  Progress: 6101 on 8158  Progress: 6102 on 8158  Progress: 6103 on 8158  Progress: 6104 on 8158  Progress: 6105 on 8158  Progress: 6106 on 8158  Progress: 6107 on 8158  Progress: 6108 on 8158  Progress: 6109 on 8158  Progress: 6110 on 8158  Progress: 6111 on 8158  Progress: 6112 on 8158  Progress: 6113 on 8158  Progress: 6114 on 8158  Progress: 6115 on 8158  Progress: 6116 on 8158  Progress: 6117 on 8158  Progress: 6118 on 8158  Progress: 6119 on 8158  Progress: 6120 on 8158  Progress: 6121 on 8158  Progress: 6122 on 8158  Progress: 6123 on 8158  Progress: 6124 on 8158  Progress: 6125 on 8158  Progress: 6126 on 8158  Progress: 6127 on 8158  Progress: 6128 on 8158  Progress: 6129 on 8158  Progress: 6130 on 8158  Progress: 6131 on 8158  Progress: 6132 on 8158  Progress: 6133 on 8158  Progress: 6134 on 8158  Progress: 6135 on 8158  Progress: 6136 on 8158  Progress: 6137 on 8158  Progress: 6138 on 8158  Progress: 6139 on 8158  Progress: 6140 on 8158  Progress: 6141 on 8158  Progress: 6142 on 8158  Progress: 6143 on 8158  Progress: 6144 on 8158  Progress: 6145 on 8158  Progress: 6146 on 8158  Progress: 6147 on 8158  Progress: 6148 on 8158  Progress: 6149 on 8158  Progress: 6150 on 8158  Progress: 6151 on 8158  Progress: 6152 on 8158  Progress: 6153 on 8158  Progress: 6154 on 8158  Progress: 6155 on 8158  Progress: 6156 on 8158  Progress: 6157 on 8158  Progress: 6158 on 8158  Progress: 6159 on 8158  Progress: 6160 on 8158  Progress: 6161 on 8158  Progress: 6162 on 8158  Progress: 6163 on 8158  Progress: 6164 on 8158  Progress: 6165 on 8158  Progress: 6166 on 8158  Progress: 6167 on 8158  Progress: 6168 on 8158  Progress: 6169 on 8158  Progress: 6170 on 8158  Progress: 6171 on 8158  Progress: 6172 on 8158  Progress: 6173 on 8158  Progress: 6174 on 8158  Progress: 6175 on 8158  Progress: 6176 on 8158  Progress: 6177 on 8158  Progress: 6178 on 8158  Progress: 6179 on 8158  Progress: 6180 on 8158  Progress: 6181 on 8158  Progress: 6182 on 8158  Progress: 6183 on 8158  Progress: 6184 on 8158  Progress: 6185 on 8158  Progress: 6186 on 8158  Progress: 6187 on 8158  Progress: 6188 on 8158  Progress: 6189 on 8158  Progress: 6190 on 8158  Progress: 6191 on 8158  Progress: 6192 on 8158  Progress: 6193 on 8158  Progress: 6194 on 8158  Progress: 6195 on 8158  Progress: 6196 on 8158  Progress: 6197 on 8158  Progress: 6198 on 8158  Progress: 6199 on 8158  Progress: 6200 on 8158  Progress: 6201 on 8158  Progress: 6202 on 8158  Progress: 6203 on 8158  Progress: 6204 on 8158  Progress: 6205 on 8158  Progress: 6206 on 8158  Progress: 6207 on 8158  Progress: 6208 on 8158  Progress: 6209 on 8158  Progress: 6210 on 8158  Progress: 6211 on 8158  Progress: 6212 on 8158  Progress: 6213 on 8158  Progress: 6214 on 8158  Progress: 6215 on 8158  Progress: 6216 on 8158  Progress: 6217 on 8158  Progress: 6218 on 8158  Progress: 6219 on 8158  Progress: 6220 on 8158  Progress: 6221 on 8158  Progress: 6222 on 8158  Progress: 6223 on 8158  Progress: 6224 on 8158  Progress: 6225 on 8158  Progress: 6226 on 8158  Progress: 6227 on 8158  Progress: 6228 on 8158  Progress: 6229 on 8158  Progress: 6230 on 8158  Progress: 6231 on 8158  Progress: 6232 on 8158  Progress: 6233 on 8158  Progress: 6234 on 8158  Progress: 6235 on 8158  Progress: 6236 on 8158  Progress: 6237 on 8158  Progress: 6238 on 8158  Progress: 6239 on 8158  Progress: 6240 on 8158  Progress: 6241 on 8158  Progress: 6242 on 8158  Progress: 6243 on 8158  Progress: 6244 on 8158  Progress: 6245 on 8158  Progress: 6246 on 8158  Progress: 6247 on 8158  Progress: 6248 on 8158  Progress: 6249 on 8158  Progress: 6250 on 8158  Progress: 6251 on 8158  Progress: 6252 on 8158  Progress: 6253 on 8158  Progress: 6254 on 8158  Progress: 6255 on 8158  Progress: 6256 on 8158  Progress: 6257 on 8158  Progress: 6258 on 8158  Progress: 6259 on 8158  Progress: 6260 on 8158  Progress: 6261 on 8158  Progress: 6262 on 8158  Progress: 6263 on 8158  Progress: 6264 on 8158  Progress: 6265 on 8158  Progress: 6266 on 8158  Progress: 6267 on 8158  Progress: 6268 on 8158  Progress: 6269 on 8158  Progress: 6270 on 8158  Progress: 6271 on 8158  Progress: 6272 on 8158  Progress: 6273 on 8158  Progress: 6274 on 8158  Progress: 6275 on 8158  Progress: 6276 on 8158  Progress: 6277 on 8158  Progress: 6278 on 8158  Progress: 6279 on 8158  Progress: 6280 on 8158  Progress: 6281 on 8158  Progress: 6282 on 8158  Progress: 6283 on 8158  Progress: 6284 on 8158  Progress: 6285 on 8158  Progress: 6286 on 8158  Progress: 6287 on 8158  Progress: 6288 on 8158  Progress: 6289 on 8158  Progress: 6290 on 8158  Progress: 6291 on 8158  Progress: 6292 on 8158  Progress: 6293 on 8158  Progress: 6294 on 8158  Progress: 6295 on 8158  Progress: 6296 on 8158  Progress: 6297 on 8158  Progress: 6298 on 8158  Progress: 6299 on 8158  Progress: 6300 on 8158  Progress: 6301 on 8158  Progress: 6302 on 8158  Progress: 6303 on 8158  Progress: 6304 on 8158  Progress: 6305 on 8158  Progress: 6306 on 8158  Progress: 6307 on 8158  Progress: 6308 on 8158  Progress: 6309 on 8158  Progress: 6310 on 8158  Progress: 6311 on 8158  Progress: 6312 on 8158  Progress: 6313 on 8158  Progress: 6314 on 8158  Progress: 6315 on 8158  Progress: 6316 on 8158  Progress: 6317 on 8158  Progress: 6318 on 8158  Progress: 6319 on 8158  Progress: 6320 on 8158  Progress: 6321 on 8158  Progress: 6322 on 8158  Progress: 6323 on 8158  Progress: 6324 on 8158  Progress: 6325 on 8158  Progress: 6326 on 8158  Progress: 6327 on 8158  Progress: 6328 on 8158  Progress: 6329 on 8158  Progress: 6330 on 8158  Progress: 6331 on 8158  Progress: 6332 on 8158  Progress: 6333 on 8158  Progress: 6334 on 8158  Progress: 6335 on 8158  Progress: 6336 on 8158  Progress: 6337 on 8158  Progress: 6338 on 8158  Progress: 6339 on 8158  Progress: 6340 on 8158  Progress: 6341 on 8158  Progress: 6342 on 8158  Progress: 6343 on 8158  Progress: 6344 on 8158  Progress: 6345 on 8158  Progress: 6346 on 8158  Progress: 6347 on 8158  Progress: 6348 on 8158  Progress: 6349 on 8158  Progress: 6350 on 8158  Progress: 6351 on 8158  Progress: 6352 on 8158  Progress: 6353 on 8158  Progress: 6354 on 8158  Progress: 6355 on 8158  Progress: 6356 on 8158  Progress: 6357 on 8158  Progress: 6358 on 8158  Progress: 6359 on 8158  Progress: 6360 on 8158  Progress: 6361 on 8158  Progress: 6362 on 8158  Progress: 6363 on 8158  Progress: 6364 on 8158  Progress: 6365 on 8158  Progress: 6366 on 8158  Progress: 6367 on 8158  Progress: 6368 on 8158  Progress: 6369 on 8158  Progress: 6370 on 8158  Progress: 6371 on 8158  Progress: 6372 on 8158  Progress: 6373 on 8158  Progress: 6374 on 8158  Progress: 6375 on 8158  Progress: 6376 on 8158  Progress: 6377 on 8158  Progress: 6378 on 8158  Progress: 6379 on 8158  Progress: 6380 on 8158  Progress: 6381 on 8158  Progress: 6382 on 8158  Progress: 6383 on 8158  Progress: 6384 on 8158  Progress: 6385 on 8158  Progress: 6386 on 8158  Progress: 6387 on 8158  Progress: 6388 on 8158  Progress: 6389 on 8158  Progress: 6390 on 8158  Progress: 6391 on 8158  Progress: 6392 on 8158  Progress: 6393 on 8158  Progress: 6394 on 8158  Progress: 6395 on 8158  Progress: 6396 on 8158  Progress: 6397 on 8158  Progress: 6398 on 8158  Progress: 6399 on 8158  Progress: 6400 on 8158  Progress: 6401 on 8158  Progress: 6402 on 8158  Progress: 6403 on 8158  Progress: 6404 on 8158  Progress: 6405 on 8158  Progress: 6406 on 8158  Progress: 6407 on 8158  Progress: 6408 on 8158  Progress: 6409 on 8158  Progress: 6410 on 8158  Progress: 6411 on 8158  Progress: 6412 on 8158  Progress: 6413 on 8158  Progress: 6414 on 8158  Progress: 6415 on 8158  Progress: 6416 on 8158  Progress: 6417 on 8158  Progress: 6418 on 8158  Progress: 6419 on 8158  Progress: 6420 on 8158  Progress: 6421 on 8158  Progress: 6422 on 8158  Progress: 6423 on 8158  Progress: 6424 on 8158  Progress: 6425 on 8158  Progress: 6426 on 8158  Progress: 6427 on 8158  Progress: 6428 on 8158  Progress: 6429 on 8158  Progress: 6430 on 8158  Progress: 6431 on 8158  Progress: 6432 on 8158  Progress: 6433 on 8158  Progress: 6434 on 8158  Progress: 6435 on 8158  Progress: 6436 on 8158  Progress: 6437 on 8158  Progress: 6438 on 8158  Progress: 6439 on 8158  Progress: 6440 on 8158  Progress: 6441 on 8158  Progress: 6442 on 8158  Progress: 6443 on 8158  Progress: 6444 on 8158  Progress: 6445 on 8158  Progress: 6446 on 8158  Progress: 6447 on 8158  Progress: 6448 on 8158  Progress: 6449 on 8158  Progress: 6450 on 8158  Progress: 6451 on 8158  Progress: 6452 on 8158  Progress: 6453 on 8158  Progress: 6454 on 8158  Progress: 6455 on 8158  Progress: 6456 on 8158  Progress: 6457 on 8158  Progress: 6458 on 8158  Progress: 6459 on 8158  Progress: 6460 on 8158  Progress: 6461 on 8158  Progress: 6462 on 8158  Progress: 6463 on 8158  Progress: 6464 on 8158  Progress: 6465 on 8158  Progress: 6466 on 8158  Progress: 6467 on 8158  Progress: 6468 on 8158  Progress: 6469 on 8158  Progress: 6470 on 8158  Progress: 6471 on 8158  Progress: 6472 on 8158  Progress: 6473 on 8158  Progress: 6474 on 8158  Progress: 6475 on 8158  Progress: 6476 on 8158  Progress: 6477 on 8158  Progress: 6478 on 8158  Progress: 6479 on 8158  Progress: 6480 on 8158  Progress: 6481 on 8158  Progress: 6482 on 8158  Progress: 6483 on 8158  Progress: 6484 on 8158  Progress: 6485 on 8158  Progress: 6486 on 8158  Progress: 6487 on 8158  Progress: 6488 on 8158  Progress: 6489 on 8158  Progress: 6490 on 8158  Progress: 6491 on 8158  Progress: 6492 on 8158  Progress: 6493 on 8158  Progress: 6494 on 8158  Progress: 6495 on 8158  Progress: 6496 on 8158  Progress: 6497 on 8158  Progress: 6498 on 8158  Progress: 6499 on 8158  Progress: 6500 on 8158  Progress: 6501 on 8158  Progress: 6502 on 8158  Progress: 6503 on 8158  Progress: 6504 on 8158  Progress: 6505 on 8158  Progress: 6506 on 8158  Progress: 6507 on 8158  Progress: 6508 on 8158  Progress: 6509 on 8158  Progress: 6510 on 8158  Progress: 6511 on 8158  Progress: 6512 on 8158  Progress: 6513 on 8158  Progress: 6514 on 8158  Progress: 6515 on 8158  Progress: 6516 on 8158  Progress: 6517 on 8158  Progress: 6518 on 8158  Progress: 6519 on 8158  Progress: 6520 on 8158  Progress: 6521 on 8158  Progress: 6522 on 8158  Progress: 6523 on 8158  Progress: 6524 on 8158  Progress: 6525 on 8158  Progress: 6526 on 8158  Progress: 6527 on 8158  Progress: 6528 on 8158  Progress: 6529 on 8158  Progress: 6530 on 8158  Progress: 6531 on 8158  Progress: 6532 on 8158  Progress: 6533 on 8158  Progress: 6534 on 8158  Progress: 6535 on 8158  Progress: 6536 on 8158  Progress: 6537 on 8158  Progress: 6538 on 8158  Progress: 6539 on 8158  Progress: 6540 on 8158  Progress: 6541 on 8158  Progress: 6542 on 8158  Progress: 6543 on 8158  Progress: 6544 on 8158  Progress: 6545 on 8158  Progress: 6546 on 8158  Progress: 6547 on 8158  Progress: 6548 on 8158  Progress: 6549 on 8158  Progress: 6550 on 8158  Progress: 6551 on 8158  Progress: 6552 on 8158  Progress: 6553 on 8158  Progress: 6554 on 8158  Progress: 6555 on 8158  Progress: 6556 on 8158  Progress: 6557 on 8158  Progress: 6558 on 8158  Progress: 6559 on 8158  Progress: 6560 on 8158  Progress: 6561 on 8158  Progress: 6562 on 8158  Progress: 6563 on 8158  Progress: 6564 on 8158  Progress: 6565 on 8158  Progress: 6566 on 8158  Progress: 6567 on 8158  Progress: 6568 on 8158  Progress: 6569 on 8158  Progress: 6570 on 8158  Progress: 6571 on 8158  Progress: 6572 on 8158  Progress: 6573 on 8158  Progress: 6574 on 8158  Progress: 6575 on 8158  Progress: 6576 on 8158  Progress: 6577 on 8158  Progress: 6578 on 8158  Progress: 6579 on 8158  Progress: 6580 on 8158  Progress: 6581 on 8158  Progress: 6582 on 8158  Progress: 6583 on 8158  Progress: 6584 on 8158  Progress: 6585 on 8158  Progress: 6586 on 8158  Progress: 6587 on 8158  Progress: 6588 on 8158  Progress: 6589 on 8158  Progress: 6590 on 8158  Progress: 6591 on 8158  Progress: 6592 on 8158  Progress: 6593 on 8158  Progress: 6594 on 8158  Progress: 6595 on 8158  Progress: 6596 on 8158  Progress: 6597 on 8158  Progress: 6598 on 8158  Progress: 6599 on 8158  Progress: 6600 on 8158  Progress: 6601 on 8158  Progress: 6602 on 8158  Progress: 6603 on 8158  Progress: 6604 on 8158  Progress: 6605 on 8158  Progress: 6606 on 8158  Progress: 6607 on 8158  Progress: 6608 on 8158  Progress: 6609 on 8158  Progress: 6610 on 8158  Progress: 6611 on 8158  Progress: 6612 on 8158  Progress: 6613 on 8158  Progress: 6614 on 8158  Progress: 6615 on 8158  Progress: 6616 on 8158  Progress: 6617 on 8158  Progress: 6618 on 8158  Progress: 6619 on 8158  Progress: 6620 on 8158  Progress: 6621 on 8158  Progress: 6622 on 8158  Progress: 6623 on 8158  Progress: 6624 on 8158  Progress: 6625 on 8158  Progress: 6626 on 8158  Progress: 6627 on 8158  Progress: 6628 on 8158  Progress: 6629 on 8158  Progress: 6630 on 8158  Progress: 6631 on 8158  Progress: 6632 on 8158  Progress: 6633 on 8158  Progress: 6634 on 8158  Progress: 6635 on 8158  Progress: 6636 on 8158  Progress: 6637 on 8158  Progress: 6638 on 8158  Progress: 6639 on 8158  Progress: 6640 on 8158  Progress: 6641 on 8158  Progress: 6642 on 8158  Progress: 6643 on 8158  Progress: 6644 on 8158  Progress: 6645 on 8158  Progress: 6646 on 8158  Progress: 6647 on 8158  Progress: 6648 on 8158  Progress: 6649 on 8158  Progress: 6650 on 8158  Progress: 6651 on 8158  Progress: 6652 on 8158  Progress: 6653 on 8158  Progress: 6654 on 8158  Progress: 6655 on 8158  Progress: 6656 on 8158  Progress: 6657 on 8158  Progress: 6658 on 8158  Progress: 6659 on 8158  Progress: 6660 on 8158  Progress: 6661 on 8158  Progress: 6662 on 8158  Progress: 6663 on 8158  Progress: 6664 on 8158  Progress: 6665 on 8158  Progress: 6666 on 8158  Progress: 6667 on 8158  Progress: 6668 on 8158  Progress: 6669 on 8158  Progress: 6670 on 8158  Progress: 6671 on 8158  Progress: 6672 on 8158  Progress: 6673 on 8158  Progress: 6674 on 8158  Progress: 6675 on 8158  Progress: 6676 on 8158  Progress: 6677 on 8158  Progress: 6678 on 8158  Progress: 6679 on 8158  Progress: 6680 on 8158  Progress: 6681 on 8158  Progress: 6682 on 8158  Progress: 6683 on 8158  Progress: 6684 on 8158  Progress: 6685 on 8158  Progress: 6686 on 8158  Progress: 6687 on 8158  Progress: 6688 on 8158  Progress: 6689 on 8158  Progress: 6690 on 8158  Progress: 6691 on 8158  Progress: 6692 on 8158  Progress: 6693 on 8158  Progress: 6694 on 8158  Progress: 6695 on 8158  Progress: 6696 on 8158  Progress: 6697 on 8158  Progress: 6698 on 8158  Progress: 6699 on 8158  Progress: 6700 on 8158  Progress: 6701 on 8158  Progress: 6702 on 8158  Progress: 6703 on 8158  Progress: 6704 on 8158  Progress: 6705 on 8158  Progress: 6706 on 8158  Progress: 6707 on 8158  Progress: 6708 on 8158  Progress: 6709 on 8158  Progress: 6710 on 8158  Progress: 6711 on 8158  Progress: 6712 on 8158  Progress: 6713 on 8158  Progress: 6714 on 8158  Progress: 6715 on 8158  Progress: 6716 on 8158  Progress: 6717 on 8158  Progress: 6718 on 8158  Progress: 6719 on 8158  Progress: 6720 on 8158  Progress: 6721 on 8158  Progress: 6722 on 8158  Progress: 6723 on 8158  Progress: 6724 on 8158  Progress: 6725 on 8158  Progress: 6726 on 8158  Progress: 6727 on 8158  Progress: 6728 on 8158  Progress: 6729 on 8158  Progress: 6730 on 8158  Progress: 6731 on 8158  Progress: 6732 on 8158  Progress: 6733 on 8158  Progress: 6734 on 8158  Progress: 6735 on 8158  Progress: 6736 on 8158  Progress: 6737 on 8158  Progress: 6738 on 8158  Progress: 6739 on 8158  Progress: 6740 on 8158  Progress: 6741 on 8158  Progress: 6742 on 8158  Progress: 6743 on 8158  Progress: 6744 on 8158  Progress: 6745 on 8158  Progress: 6746 on 8158  Progress: 6747 on 8158  Progress: 6748 on 8158  Progress: 6749 on 8158  Progress: 6750 on 8158  Progress: 6751 on 8158  Progress: 6752 on 8158  Progress: 6753 on 8158  Progress: 6754 on 8158  Progress: 6755 on 8158  Progress: 6756 on 8158  Progress: 6757 on 8158  Progress: 6758 on 8158  Progress: 6759 on 8158  Progress: 6760 on 8158  Progress: 6761 on 8158  Progress: 6762 on 8158  Progress: 6763 on 8158  Progress: 6764 on 8158  Progress: 6765 on 8158  Progress: 6766 on 8158  Progress: 6767 on 8158  Progress: 6768 on 8158  Progress: 6769 on 8158  Progress: 6770 on 8158  Progress: 6771 on 8158  Progress: 6772 on 8158  Progress: 6773 on 8158  Progress: 6774 on 8158  Progress: 6775 on 8158  Progress: 6776 on 8158  Progress: 6777 on 8158  Progress: 6778 on 8158  Progress: 6779 on 8158  Progress: 6780 on 8158  Progress: 6781 on 8158  Progress: 6782 on 8158  Progress: 6783 on 8158  Progress: 6784 on 8158  Progress: 6785 on 8158  Progress: 6786 on 8158  Progress: 6787 on 8158  Progress: 6788 on 8158  Progress: 6789 on 8158  Progress: 6790 on 8158  Progress: 6791 on 8158  Progress: 6792 on 8158  Progress: 6793 on 8158  Progress: 6794 on 8158  Progress: 6795 on 8158  Progress: 6796 on 8158  Progress: 6797 on 8158  Progress: 6798 on 8158  Progress: 6799 on 8158  Progress: 6800 on 8158  Progress: 6801 on 8158  Progress: 6802 on 8158  Progress: 6803 on 8158  Progress: 6804 on 8158  Progress: 6805 on 8158  Progress: 6806 on 8158  Progress: 6807 on 8158  Progress: 6808 on 8158  Progress: 6809 on 8158  Progress: 6810 on 8158  Progress: 6811 on 8158  Progress: 6812 on 8158  Progress: 6813 on 8158  Progress: 6814 on 8158  Progress: 6815 on 8158  Progress: 6816 on 8158  Progress: 6817 on 8158  Progress: 6818 on 8158  Progress: 6819 on 8158  Progress: 6820 on 8158  Progress: 6821 on 8158  Progress: 6822 on 8158  Progress: 6823 on 8158  Progress: 6824 on 8158  Progress: 6825 on 8158  Progress: 6826 on 8158  Progress: 6827 on 8158  Progress: 6828 on 8158  Progress: 6829 on 8158  Progress: 6830 on 8158  Progress: 6831 on 8158  Progress: 6832 on 8158  Progress: 6833 on 8158  Progress: 6834 on 8158  Progress: 6835 on 8158  Progress: 6836 on 8158  Progress: 6837 on 8158  Progress: 6838 on 8158  Progress: 6839 on 8158  Progress: 6840 on 8158  Progress: 6841 on 8158  Progress: 6842 on 8158  Progress: 6843 on 8158  Progress: 6844 on 8158  Progress: 6845 on 8158  Progress: 6846 on 8158  Progress: 6847 on 8158  Progress: 6848 on 8158  Progress: 6849 on 8158  Progress: 6850 on 8158  Progress: 6851 on 8158  Progress: 6852 on 8158  Progress: 6853 on 8158  Progress: 6854 on 8158  Progress: 6855 on 8158  Progress: 6856 on 8158  Progress: 6857 on 8158  Progress: 6858 on 8158  Progress: 6859 on 8158  Progress: 6860 on 8158  Progress: 6861 on 8158  Progress: 6862 on 8158  Progress: 6863 on 8158  Progress: 6864 on 8158  Progress: 6865 on 8158  Progress: 6866 on 8158  Progress: 6867 on 8158  Progress: 6868 on 8158  Progress: 6869 on 8158  Progress: 6870 on 8158  Progress: 6871 on 8158  Progress: 6872 on 8158  Progress: 6873 on 8158  Progress: 6874 on 8158  Progress: 6875 on 8158  Progress: 6876 on 8158  Progress: 6877 on 8158  Progress: 6878 on 8158  Progress: 6879 on 8158  Progress: 6880 on 8158  Progress: 6881 on 8158  Progress: 6882 on 8158  Progress: 6883 on 8158  Progress: 6884 on 8158  Progress: 6885 on 8158  Progress: 6886 on 8158  Progress: 6887 on 8158  Progress: 6888 on 8158  Progress: 6889 on 8158  Progress: 6890 on 8158  Progress: 6891 on 8158  Progress: 6892 on 8158  Progress: 6893 on 8158  Progress: 6894 on 8158  Progress: 6895 on 8158  Progress: 6896 on 8158  Progress: 6897 on 8158  Progress: 6898 on 8158  Progress: 6899 on 8158  Progress: 6900 on 8158  Progress: 6901 on 8158  Progress: 6902 on 8158  Progress: 6903 on 8158  Progress: 6904 on 8158  Progress: 6905 on 8158  Progress: 6906 on 8158  Progress: 6907 on 8158  Progress: 6908 on 8158  Progress: 6909 on 8158  Progress: 6910 on 8158  Progress: 6911 on 8158  Progress: 6912 on 8158  Progress: 6913 on 8158  Progress: 6914 on 8158  Progress: 6915 on 8158  Progress: 6916 on 8158  Progress: 6917 on 8158  Progress: 6918 on 8158  Progress: 6919 on 8158  Progress: 6920 on 8158  Progress: 6921 on 8158  Progress: 6922 on 8158  Progress: 6923 on 8158  Progress: 6924 on 8158  Progress: 6925 on 8158  Progress: 6926 on 8158  Progress: 6927 on 8158  Progress: 6928 on 8158  Progress: 6929 on 8158  Progress: 6930 on 8158  Progress: 6931 on 8158  Progress: 6932 on 8158  Progress: 6933 on 8158  Progress: 6934 on 8158  Progress: 6935 on 8158  Progress: 6936 on 8158  Progress: 6937 on 8158  Progress: 6938 on 8158  Progress: 6939 on 8158  Progress: 6940 on 8158  Progress: 6941 on 8158  Progress: 6942 on 8158  Progress: 6943 on 8158  Progress: 6944 on 8158  Progress: 6945 on 8158  Progress: 6946 on 8158  Progress: 6947 on 8158  Progress: 6948 on 8158  Progress: 6949 on 8158  Progress: 6950 on 8158  Progress: 6951 on 8158  Progress: 6952 on 8158  Progress: 6953 on 8158  Progress: 6954 on 8158  Progress: 6955 on 8158  Progress: 6956 on 8158  Progress: 6957 on 8158  Progress: 6958 on 8158  Progress: 6959 on 8158  Progress: 6960 on 8158  Progress: 6961 on 8158  Progress: 6962 on 8158  Progress: 6963 on 8158  Progress: 6964 on 8158  Progress: 6965 on 8158  Progress: 6966 on 8158  Progress: 6967 on 8158  Progress: 6968 on 8158  Progress: 6969 on 8158  Progress: 6970 on 8158  Progress: 6971 on 8158  Progress: 6972 on 8158  Progress: 6973 on 8158  Progress: 6974 on 8158  Progress: 6975 on 8158  Progress: 6976 on 8158  Progress: 6977 on 8158  Progress: 6978 on 8158  Progress: 6979 on 8158  Progress: 6980 on 8158  Progress: 6981 on 8158  Progress: 6982 on 8158  Progress: 6983 on 8158  Progress: 6984 on 8158  Progress: 6985 on 8158  Progress: 6986 on 8158  Progress: 6987 on 8158  Progress: 6988 on 8158  Progress: 6989 on 8158  Progress: 6990 on 8158  Progress: 6991 on 8158  Progress: 6992 on 8158  Progress: 6993 on 8158  Progress: 6994 on 8158  Progress: 6995 on 8158  Progress: 6996 on 8158  Progress: 6997 on 8158  Progress: 6998 on 8158  Progress: 6999 on 8158  Progress: 7000 on 8158  Progress: 7001 on 8158  Progress: 7002 on 8158  Progress: 7003 on 8158  Progress: 7004 on 8158  Progress: 7005 on 8158  Progress: 7006 on 8158  Progress: 7007 on 8158  Progress: 7008 on 8158  Progress: 7009 on 8158  Progress: 7010 on 8158  Progress: 7011 on 8158  Progress: 7012 on 8158  Progress: 7013 on 8158  Progress: 7014 on 8158  Progress: 7015 on 8158  Progress: 7016 on 8158  Progress: 7017 on 8158  Progress: 7018 on 8158  Progress: 7019 on 8158  Progress: 7020 on 8158  Progress: 7021 on 8158  Progress: 7022 on 8158  Progress: 7023 on 8158  Progress: 7024 on 8158  Progress: 7025 on 8158  Progress: 7026 on 8158  Progress: 7027 on 8158  Progress: 7028 on 8158  Progress: 7029 on 8158  Progress: 7030 on 8158  Progress: 7031 on 8158  Progress: 7032 on 8158  Progress: 7033 on 8158  Progress: 7034 on 8158  Progress: 7035 on 8158  Progress: 7036 on 8158  Progress: 7037 on 8158  Progress: 7038 on 8158  Progress: 7039 on 8158  Progress: 7040 on 8158  Progress: 7041 on 8158  Progress: 7042 on 8158  Progress: 7043 on 8158  Progress: 7044 on 8158  Progress: 7045 on 8158  Progress: 7046 on 8158  Progress: 7047 on 8158  Progress: 7048 on 8158  Progress: 7049 on 8158  Progress: 7050 on 8158  Progress: 7051 on 8158  Progress: 7052 on 8158  Progress: 7053 on 8158  Progress: 7054 on 8158  Progress: 7055 on 8158  Progress: 7056 on 8158  Progress: 7057 on 8158  Progress: 7058 on 8158  Progress: 7059 on 8158  Progress: 7060 on 8158  Progress: 7061 on 8158  Progress: 7062 on 8158  Progress: 7063 on 8158  Progress: 7064 on 8158  Progress: 7065 on 8158  Progress: 7066 on 8158  Progress: 7067 on 8158  Progress: 7068 on 8158  Progress: 7069 on 8158  Progress: 7070 on 8158  Progress: 7071 on 8158  Progress: 7072 on 8158  Progress: 7073 on 8158  Progress: 7074 on 8158  Progress: 7075 on 8158  Progress: 7076 on 8158  Progress: 7077 on 8158  Progress: 7078 on 8158  Progress: 7079 on 8158  Progress: 7080 on 8158  Progress: 7081 on 8158  Progress: 7082 on 8158  Progress: 7083 on 8158  Progress: 7084 on 8158  Progress: 7085 on 8158  Progress: 7086 on 8158  Progress: 7087 on 8158  Progress: 7088 on 8158  Progress: 7089 on 8158  Progress: 7090 on 8158  Progress: 7091 on 8158  Progress: 7092 on 8158  Progress: 7093 on 8158  Progress: 7094 on 8158  Progress: 7095 on 8158  Progress: 7096 on 8158  Progress: 7097 on 8158  Progress: 7098 on 8158  Progress: 7099 on 8158  Progress: 7100 on 8158  Progress: 7101 on 8158  Progress: 7102 on 8158  Progress: 7103 on 8158  Progress: 7104 on 8158  Progress: 7105 on 8158  Progress: 7106 on 8158  Progress: 7107 on 8158  Progress: 7108 on 8158  Progress: 7109 on 8158  Progress: 7110 on 8158  Progress: 7111 on 8158  Progress: 7112 on 8158  Progress: 7113 on 8158  Progress: 7114 on 8158  Progress: 7115 on 8158  Progress: 7116 on 8158  Progress: 7117 on 8158  Progress: 7118 on 8158  Progress: 7119 on 8158  Progress: 7120 on 8158  Progress: 7121 on 8158  Progress: 7122 on 8158  Progress: 7123 on 8158  Progress: 7124 on 8158  Progress: 7125 on 8158  Progress: 7126 on 8158  Progress: 7127 on 8158  Progress: 7128 on 8158  Progress: 7129 on 8158  Progress: 7130 on 8158  Progress: 7131 on 8158  Progress: 7132 on 8158  Progress: 7133 on 8158  Progress: 7134 on 8158  Progress: 7135 on 8158  Progress: 7136 on 8158  Progress: 7137 on 8158  Progress: 7138 on 8158  Progress: 7139 on 8158  Progress: 7140 on 8158  Progress: 7141 on 8158  Progress: 7142 on 8158  Progress: 7143 on 8158  Progress: 7144 on 8158  Progress: 7145 on 8158  Progress: 7146 on 8158  Progress: 7147 on 8158  Progress: 7148 on 8158  Progress: 7149 on 8158  Progress: 7150 on 8158  Progress: 7151 on 8158  Progress: 7152 on 8158  Progress: 7153 on 8158  Progress: 7154 on 8158  Progress: 7155 on 8158  Progress: 7156 on 8158  Progress: 7157 on 8158  Progress: 7158 on 8158  Progress: 7159 on 8158  Progress: 7160 on 8158  Progress: 7161 on 8158  Progress: 7162 on 8158  Progress: 7163 on 8158  Progress: 7164 on 8158  Progress: 7165 on 8158  Progress: 7166 on 8158  Progress: 7167 on 8158  Progress: 7168 on 8158  Progress: 7169 on 8158  Progress: 7170 on 8158  Progress: 7171 on 8158  Progress: 7172 on 8158  Progress: 7173 on 8158  Progress: 7174 on 8158  Progress: 7175 on 8158  Progress: 7176 on 8158  Progress: 7177 on 8158  Progress: 7178 on 8158  Progress: 7179 on 8158  Progress: 7180 on 8158  Progress: 7181 on 8158  Progress: 7182 on 8158  Progress: 7183 on 8158  Progress: 7184 on 8158  Progress: 7185 on 8158  Progress: 7186 on 8158  Progress: 7187 on 8158  Progress: 7188 on 8158  Progress: 7189 on 8158  Progress: 7190 on 8158  Progress: 7191 on 8158  Progress: 7192 on 8158  Progress: 7193 on 8158  Progress: 7194 on 8158  Progress: 7195 on 8158  Progress: 7196 on 8158  Progress: 7197 on 8158  Progress: 7198 on 8158  Progress: 7199 on 8158  Progress: 7200 on 8158  Progress: 7201 on 8158  Progress: 7202 on 8158  Progress: 7203 on 8158  Progress: 7204 on 8158  Progress: 7205 on 8158  Progress: 7206 on 8158  Progress: 7207 on 8158  Progress: 7208 on 8158  Progress: 7209 on 8158  Progress: 7210 on 8158  Progress: 7211 on 8158  Progress: 7212 on 8158  Progress: 7213 on 8158  Progress: 7214 on 8158  Progress: 7215 on 8158  Progress: 7216 on 8158  Progress: 7217 on 8158  Progress: 7218 on 8158  Progress: 7219 on 8158  Progress: 7220 on 8158  Progress: 7221 on 8158  Progress: 7222 on 8158  Progress: 7223 on 8158  Progress: 7224 on 8158  Progress: 7225 on 8158  Progress: 7226 on 8158  Progress: 7227 on 8158  Progress: 7228 on 8158  Progress: 7229 on 8158  Progress: 7230 on 8158  Progress: 7231 on 8158  Progress: 7232 on 8158  Progress: 7233 on 8158  Progress: 7234 on 8158  Progress: 7235 on 8158  Progress: 7236 on 8158  Progress: 7237 on 8158  Progress: 7238 on 8158  Progress: 7239 on 8158  Progress: 7240 on 8158  Progress: 7241 on 8158  Progress: 7242 on 8158  Progress: 7243 on 8158  Progress: 7244 on 8158  Progress: 7245 on 8158  Progress: 7246 on 8158  Progress: 7247 on 8158  Progress: 7248 on 8158  Progress: 7249 on 8158  Progress: 7250 on 8158  Progress: 7251 on 8158  Progress: 7252 on 8158  Progress: 7253 on 8158  Progress: 7254 on 8158  Progress: 7255 on 8158  Progress: 7256 on 8158  Progress: 7257 on 8158  Progress: 7258 on 8158  Progress: 7259 on 8158  Progress: 7260 on 8158  Progress: 7261 on 8158  Progress: 7262 on 8158  Progress: 7263 on 8158  Progress: 7264 on 8158  Progress: 7265 on 8158  Progress: 7266 on 8158  Progress: 7267 on 8158  Progress: 7268 on 8158  Progress: 7269 on 8158  Progress: 7270 on 8158  Progress: 7271 on 8158  Progress: 7272 on 8158  Progress: 7273 on 8158  Progress: 7274 on 8158  Progress: 7275 on 8158  Progress: 7276 on 8158  Progress: 7277 on 8158  Progress: 7278 on 8158  Progress: 7279 on 8158  Progress: 7280 on 8158  Progress: 7281 on 8158  Progress: 7282 on 8158  Progress: 7283 on 8158  Progress: 7284 on 8158  Progress: 7285 on 8158  Progress: 7286 on 8158  Progress: 7287 on 8158  Progress: 7288 on 8158  Progress: 7289 on 8158  Progress: 7290 on 8158  Progress: 7291 on 8158  Progress: 7292 on 8158  Progress: 7293 on 8158  Progress: 7294 on 8158  Progress: 7295 on 8158  Progress: 7296 on 8158  Progress: 7297 on 8158  Progress: 7298 on 8158  Progress: 7299 on 8158  Progress: 7300 on 8158  Progress: 7301 on 8158  Progress: 7302 on 8158  Progress: 7303 on 8158  Progress: 7304 on 8158  Progress: 7305 on 8158  Progress: 7306 on 8158  Progress: 7307 on 8158  Progress: 7308 on 8158  Progress: 7309 on 8158  Progress: 7310 on 8158  Progress: 7311 on 8158  Progress: 7312 on 8158  Progress: 7313 on 8158  Progress: 7314 on 8158  Progress: 7315 on 8158  Progress: 7316 on 8158  Progress: 7317 on 8158  Progress: 7318 on 8158  Progress: 7319 on 8158  Progress: 7320 on 8158  Progress: 7321 on 8158  Progress: 7322 on 8158  Progress: 7323 on 8158  Progress: 7324 on 8158  Progress: 7325 on 8158  Progress: 7326 on 8158  Progress: 7327 on 8158  Progress: 7328 on 8158  Progress: 7329 on 8158  Progress: 7330 on 8158  Progress: 7331 on 8158  Progress: 7332 on 8158  Progress: 7333 on 8158  Progress: 7334 on 8158  Progress: 7335 on 8158  Progress: 7336 on 8158  Progress: 7337 on 8158  Progress: 7338 on 8158  Progress: 7339 on 8158  Progress: 7340 on 8158  Progress: 7341 on 8158  Progress: 7342 on 8158  Progress: 7343 on 8158  Progress: 7344 on 8158  Progress: 7345 on 8158  Progress: 7346 on 8158  Progress: 7347 on 8158  Progress: 7348 on 8158  Progress: 7349 on 8158  Progress: 7350 on 8158  Progress: 7351 on 8158  Progress: 7352 on 8158  Progress: 7353 on 8158  Progress: 7354 on 8158  Progress: 7355 on 8158  Progress: 7356 on 8158  Progress: 7357 on 8158  Progress: 7358 on 8158  Progress: 7359 on 8158  Progress: 7360 on 8158  Progress: 7361 on 8158  Progress: 7362 on 8158  Progress: 7363 on 8158  Progress: 7364 on 8158  Progress: 7365 on 8158  Progress: 7366 on 8158  Progress: 7367 on 8158  Progress: 7368 on 8158  Progress: 7369 on 8158  Progress: 7370 on 8158  Progress: 7371 on 8158  Progress: 7372 on 8158  Progress: 7373 on 8158  Progress: 7374 on 8158  Progress: 7375 on 8158  Progress: 7376 on 8158  Progress: 7377 on 8158  Progress: 7378 on 8158  Progress: 7379 on 8158  Progress: 7380 on 8158  Progress: 7381 on 8158  Progress: 7382 on 8158  Progress: 7383 on 8158  Progress: 7384 on 8158  Progress: 7385 on 8158  Progress: 7386 on 8158  Progress: 7387 on 8158  Progress: 7388 on 8158  Progress: 7389 on 8158  Progress: 7390 on 8158  Progress: 7391 on 8158  Progress: 7392 on 8158  Progress: 7393 on 8158  Progress: 7394 on 8158  Progress: 7395 on 8158  Progress: 7396 on 8158  Progress: 7397 on 8158  Progress: 7398 on 8158  Progress: 7399 on 8158  Progress: 7400 on 8158  Progress: 7401 on 8158  Progress: 7402 on 8158  Progress: 7403 on 8158  Progress: 7404 on 8158  Progress: 7405 on 8158  Progress: 7406 on 8158  Progress: 7407 on 8158  Progress: 7408 on 8158  Progress: 7409 on 8158  Progress: 7410 on 8158  Progress: 7411 on 8158  Progress: 7412 on 8158  Progress: 7413 on 8158  Progress: 7414 on 8158  Progress: 7415 on 8158  Progress: 7416 on 8158  Progress: 7417 on 8158  Progress: 7418 on 8158  Progress: 7419 on 8158  Progress: 7420 on 8158  Progress: 7421 on 8158  Progress: 7422 on 8158  Progress: 7423 on 8158  Progress: 7424 on 8158  Progress: 7425 on 8158  Progress: 7426 on 8158  Progress: 7427 on 8158  Progress: 7428 on 8158  Progress: 7429 on 8158  Progress: 7430 on 8158  Progress: 7431 on 8158  Progress: 7432 on 8158  Progress: 7433 on 8158  Progress: 7434 on 8158  Progress: 7435 on 8158  Progress: 7436 on 8158  Progress: 7437 on 8158  Progress: 7438 on 8158  Progress: 7439 on 8158  Progress: 7440 on 8158  Progress: 7441 on 8158  Progress: 7442 on 8158  Progress: 7443 on 8158  Progress: 7444 on 8158  Progress: 7445 on 8158  Progress: 7446 on 8158  Progress: 7447 on 8158  Progress: 7448 on 8158  Progress: 7449 on 8158  Progress: 7450 on 8158  Progress: 7451 on 8158  Progress: 7452 on 8158  Progress: 7453 on 8158  Progress: 7454 on 8158  Progress: 7455 on 8158  Progress: 7456 on 8158  Progress: 7457 on 8158  Progress: 7458 on 8158  Progress: 7459 on 8158  Progress: 7460 on 8158  Progress: 7461 on 8158  Progress: 7462 on 8158  Progress: 7463 on 8158  Progress: 7464 on 8158  Progress: 7465 on 8158  Progress: 7466 on 8158  Progress: 7467 on 8158  Progress: 7468 on 8158  Progress: 7469 on 8158  Progress: 7470 on 8158  Progress: 7471 on 8158  Progress: 7472 on 8158  Progress: 7473 on 8158  Progress: 7474 on 8158  Progress: 7475 on 8158  Progress: 7476 on 8158  Progress: 7477 on 8158  Progress: 7478 on 8158  Progress: 7479 on 8158  Progress: 7480 on 8158  Progress: 7481 on 8158  Progress: 7482 on 8158  Progress: 7483 on 8158  Progress: 7484 on 8158  Progress: 7485 on 8158  Progress: 7486 on 8158  Progress: 7487 on 8158  Progress: 7488 on 8158  Progress: 7489 on 8158  Progress: 7490 on 8158  Progress: 7491 on 8158  Progress: 7492 on 8158  Progress: 7493 on 8158  Progress: 7494 on 8158  Progress: 7495 on 8158  Progress: 7496 on 8158  Progress: 7497 on 8158  Progress: 7498 on 8158  Progress: 7499 on 8158  Progress: 7500 on 8158  Progress: 7501 on 8158  Progress: 7502 on 8158  Progress: 7503 on 8158  Progress: 7504 on 8158  Progress: 7505 on 8158  Progress: 7506 on 8158  Progress: 7507 on 8158  Progress: 7508 on 8158  Progress: 7509 on 8158  Progress: 7510 on 8158  Progress: 7511 on 8158  Progress: 7512 on 8158  Progress: 7513 on 8158  Progress: 7514 on 8158  Progress: 7515 on 8158  Progress: 7516 on 8158  Progress: 7517 on 8158  Progress: 7518 on 8158  Progress: 7519 on 8158  Progress: 7520 on 8158  Progress: 7521 on 8158  Progress: 7522 on 8158  Progress: 7523 on 8158  Progress: 7524 on 8158  Progress: 7525 on 8158  Progress: 7526 on 8158  Progress: 7527 on 8158  Progress: 7528 on 8158  Progress: 7529 on 8158  Progress: 7530 on 8158  Progress: 7531 on 8158  Progress: 7532 on 8158  Progress: 7533 on 8158  Progress: 7534 on 8158  Progress: 7535 on 8158  Progress: 7536 on 8158  Progress: 7537 on 8158  Progress: 7538 on 8158  Progress: 7539 on 8158  Progress: 7540 on 8158  Progress: 7541 on 8158  Progress: 7542 on 8158  Progress: 7543 on 8158  Progress: 7544 on 8158  Progress: 7545 on 8158  Progress: 7546 on 8158  Progress: 7547 on 8158  Progress: 7548 on 8158  Progress: 7549 on 8158  Progress: 7550 on 8158  Progress: 7551 on 8158  Progress: 7552 on 8158  Progress: 7553 on 8158  Progress: 7554 on 8158  Progress: 7555 on 8158  Progress: 7556 on 8158  Progress: 7557 on 8158  Progress: 7558 on 8158  Progress: 7559 on 8158  Progress: 7560 on 8158  Progress: 7561 on 8158  Progress: 7562 on 8158  Progress: 7563 on 8158  Progress: 7564 on 8158  Progress: 7565 on 8158  Progress: 7566 on 8158  Progress: 7567 on 8158  Progress: 7568 on 8158  Progress: 7569 on 8158  Progress: 7570 on 8158  Progress: 7571 on 8158  Progress: 7572 on 8158  Progress: 7573 on 8158  Progress: 7574 on 8158  Progress: 7575 on 8158  Progress: 7576 on 8158  Progress: 7577 on 8158  Progress: 7578 on 8158  Progress: 7579 on 8158  Progress: 7580 on 8158  Progress: 7581 on 8158  Progress: 7582 on 8158  Progress: 7583 on 8158  Progress: 7584 on 8158  Progress: 7585 on 8158  Progress: 7586 on 8158  Progress: 7587 on 8158  Progress: 7588 on 8158  Progress: 7589 on 8158  Progress: 7590 on 8158  Progress: 7591 on 8158  Progress: 7592 on 8158  Progress: 7593 on 8158  Progress: 7594 on 8158  Progress: 7595 on 8158  Progress: 7596 on 8158  Progress: 7597 on 8158  Progress: 7598 on 8158  Progress: 7599 on 8158  Progress: 7600 on 8158  Progress: 7601 on 8158  Progress: 7602 on 8158  Progress: 7603 on 8158  Progress: 7604 on 8158  Progress: 7605 on 8158  Progress: 7606 on 8158  Progress: 7607 on 8158  Progress: 7608 on 8158  Progress: 7609 on 8158  Progress: 7610 on 8158  Progress: 7611 on 8158  Progress: 7612 on 8158  Progress: 7613 on 8158  Progress: 7614 on 8158  Progress: 7615 on 8158  Progress: 7616 on 8158  Progress: 7617 on 8158  Progress: 7618 on 8158  Progress: 7619 on 8158  Progress: 7620 on 8158  Progress: 7621 on 8158  Progress: 7622 on 8158  Progress: 7623 on 8158  Progress: 7624 on 8158  Progress: 7625 on 8158  Progress: 7626 on 8158  Progress: 7627 on 8158  Progress: 7628 on 8158  Progress: 7629 on 8158  Progress: 7630 on 8158  Progress: 7631 on 8158  Progress: 7632 on 8158  Progress: 7633 on 8158  Progress: 7634 on 8158  Progress: 7635 on 8158  Progress: 7636 on 8158  Progress: 7637 on 8158  Progress: 7638 on 8158  Progress: 7639 on 8158  Progress: 7640 on 8158  Progress: 7641 on 8158  Progress: 7642 on 8158  Progress: 7643 on 8158  Progress: 7644 on 8158  Progress: 7645 on 8158  Progress: 7646 on 8158  Progress: 7647 on 8158  Progress: 7648 on 8158  Progress: 7649 on 8158  Progress: 7650 on 8158  Progress: 7651 on 8158  Progress: 7652 on 8158  Progress: 7653 on 8158  Progress: 7654 on 8158  Progress: 7655 on 8158  Progress: 7656 on 8158  Progress: 7657 on 8158  Progress: 7658 on 8158  Progress: 7659 on 8158  Progress: 7660 on 8158  Progress: 7661 on 8158  Progress: 7662 on 8158  Progress: 7663 on 8158  Progress: 7664 on 8158  Progress: 7665 on 8158  Progress: 7666 on 8158  Progress: 7667 on 8158  Progress: 7668 on 8158  Progress: 7669 on 8158  Progress: 7670 on 8158  Progress: 7671 on 8158  Progress: 7672 on 8158  Progress: 7673 on 8158  Progress: 7674 on 8158  Progress: 7675 on 8158  Progress: 7676 on 8158  Progress: 7677 on 8158  Progress: 7678 on 8158  Progress: 7679 on 8158  Progress: 7680 on 8158  Progress: 7681 on 8158  Progress: 7682 on 8158  Progress: 7683 on 8158  Progress: 7684 on 8158  Progress: 7685 on 8158  Progress: 7686 on 8158  Progress: 7687 on 8158  Progress: 7688 on 8158  Progress: 7689 on 8158  Progress: 7690 on 8158  Progress: 7691 on 8158  Progress: 7692 on 8158  Progress: 7693 on 8158  Progress: 7694 on 8158  Progress: 7695 on 8158  Progress: 7696 on 8158  Progress: 7697 on 8158  Progress: 7698 on 8158  Progress: 7699 on 8158  Progress: 7700 on 8158  Progress: 7701 on 8158  Progress: 7702 on 8158  Progress: 7703 on 8158  Progress: 7704 on 8158  Progress: 7705 on 8158  Progress: 7706 on 8158  Progress: 7707 on 8158  Progress: 7708 on 8158  Progress: 7709 on 8158  Progress: 7710 on 8158  Progress: 7711 on 8158  Progress: 7712 on 8158  Progress: 7713 on 8158  Progress: 7714 on 8158  Progress: 7715 on 8158  Progress: 7716 on 8158  Progress: 7717 on 8158  Progress: 7718 on 8158  Progress: 7719 on 8158  Progress: 7720 on 8158  Progress: 7721 on 8158  Progress: 7722 on 8158  Progress: 7723 on 8158  Progress: 7724 on 8158  Progress: 7725 on 8158  Progress: 7726 on 8158  Progress: 7727 on 8158  Progress: 7728 on 8158  Progress: 7729 on 8158  Progress: 7730 on 8158  Progress: 7731 on 8158  Progress: 7732 on 8158  Progress: 7733 on 8158  Progress: 7734 on 8158  Progress: 7735 on 8158  Progress: 7736 on 8158  Progress: 7737 on 8158  Progress: 7738 on 8158  Progress: 7739 on 8158  Progress: 7740 on 8158  Progress: 7741 on 8158  Progress: 7742 on 8158  Progress: 7743 on 8158  Progress: 7744 on 8158  Progress: 7745 on 8158  Progress: 7746 on 8158  Progress: 7747 on 8158  Progress: 7748 on 8158  Progress: 7749 on 8158  Progress: 7750 on 8158  Progress: 7751 on 8158  Progress: 7752 on 8158  Progress: 7753 on 8158  Progress: 7754 on 8158  Progress: 7755 on 8158  Progress: 7756 on 8158  Progress: 7757 on 8158  Progress: 7758 on 8158  Progress: 7759 on 8158  Progress: 7760 on 8158  Progress: 7761 on 8158  Progress: 7762 on 8158  Progress: 7763 on 8158  Progress: 7764 on 8158  Progress: 7765 on 8158  Progress: 7766 on 8158  Progress: 7767 on 8158  Progress: 7768 on 8158  Progress: 7769 on 8158  Progress: 7770 on 8158  Progress: 7771 on 8158  Progress: 7772 on 8158  Progress: 7773 on 8158  Progress: 7774 on 8158  Progress: 7775 on 8158  Progress: 7776 on 8158  Progress: 7777 on 8158  Progress: 7778 on 8158  Progress: 7779 on 8158  Progress: 7780 on 8158  Progress: 7781 on 8158  Progress: 7782 on 8158  Progress: 7783 on 8158  Progress: 7784 on 8158  Progress: 7785 on 8158  Progress: 7786 on 8158  Progress: 7787 on 8158  Progress: 7788 on 8158  Progress: 7789 on 8158  Progress: 7790 on 8158  Progress: 7791 on 8158  Progress: 7792 on 8158  Progress: 7793 on 8158  Progress: 7794 on 8158  Progress: 7795 on 8158  Progress: 7796 on 8158  Progress: 7797 on 8158  Progress: 7798 on 8158  Progress: 7799 on 8158  Progress: 7800 on 8158  Progress: 7801 on 8158  Progress: 7802 on 8158  Progress: 7803 on 8158  Progress: 7804 on 8158  Progress: 7805 on 8158  Progress: 7806 on 8158  Progress: 7807 on 8158  Progress: 7808 on 8158  Progress: 7809 on 8158  Progress: 7810 on 8158  Progress: 7811 on 8158  Progress: 7812 on 8158  Progress: 7813 on 8158  Progress: 7814 on 8158  Progress: 7815 on 8158  Progress: 7816 on 8158  Progress: 7817 on 8158  Progress: 7818 on 8158  Progress: 7819 on 8158  Progress: 7820 on 8158  Progress: 7821 on 8158  Progress: 7822 on 8158  Progress: 7823 on 8158  Progress: 7824 on 8158  Progress: 7825 on 8158  Progress: 7826 on 8158  Progress: 7827 on 8158  Progress: 7828 on 8158  Progress: 7829 on 8158  Progress: 7830 on 8158  Progress: 7831 on 8158  Progress: 7832 on 8158  Progress: 7833 on 8158  Progress: 7834 on 8158  Progress: 7835 on 8158  Progress: 7836 on 8158  Progress: 7837 on 8158  Progress: 7838 on 8158  Progress: 7839 on 8158  Progress: 7840 on 8158  Progress: 7841 on 8158  Progress: 7842 on 8158  Progress: 7843 on 8158  Progress: 7844 on 8158  Progress: 7845 on 8158  Progress: 7846 on 8158  Progress: 7847 on 8158  Progress: 7848 on 8158  Progress: 7849 on 8158  Progress: 7850 on 8158  Progress: 7851 on 8158  Progress: 7852 on 8158  Progress: 7853 on 8158  Progress: 7854 on 8158  Progress: 7855 on 8158  Progress: 7856 on 8158  Progress: 7857 on 8158  Progress: 7858 on 8158  Progress: 7859 on 8158  Progress: 7860 on 8158  Progress: 7861 on 8158  Progress: 7862 on 8158  Progress: 7863 on 8158  Progress: 7864 on 8158  Progress: 7865 on 8158  Progress: 7866 on 8158  Progress: 7867 on 8158  Progress: 7868 on 8158  Progress: 7869 on 8158  Progress: 7870 on 8158  Progress: 7871 on 8158  Progress: 7872 on 8158  Progress: 7873 on 8158  Progress: 7874 on 8158  Progress: 7875 on 8158  Progress: 7876 on 8158  Progress: 7877 on 8158  Progress: 7878 on 8158  Progress: 7879 on 8158  Progress: 7880 on 8158  Progress: 7881 on 8158  Progress: 7882 on 8158  Progress: 7883 on 8158  Progress: 7884 on 8158  Progress: 7885 on 8158  Progress: 7886 on 8158  Progress: 7887 on 8158  Progress: 7888 on 8158  Progress: 7889 on 8158  Progress: 7890 on 8158  Progress: 7891 on 8158  Progress: 7892 on 8158  Progress: 7893 on 8158  Progress: 7894 on 8158  Progress: 7895 on 8158  Progress: 7896 on 8158  Progress: 7897 on 8158  Progress: 7898 on 8158  Progress: 7899 on 8158  Progress: 7900 on 8158  Progress: 7901 on 8158  Progress: 7902 on 8158  Progress: 7903 on 8158  Progress: 7904 on 8158  Progress: 7905 on 8158  Progress: 7906 on 8158  Progress: 7907 on 8158  Progress: 7908 on 8158  Progress: 7909 on 8158  Progress: 7910 on 8158  Progress: 7911 on 8158  Progress: 7912 on 8158  Progress: 7913 on 8158  Progress: 7914 on 8158  Progress: 7915 on 8158  Progress: 7916 on 8158  Progress: 7917 on 8158  Progress: 7918 on 8158  Progress: 7919 on 8158  Progress: 7920 on 8158  Progress: 7921 on 8158  Progress: 7922 on 8158  Progress: 7923 on 8158  Progress: 7924 on 8158  Progress: 7925 on 8158  Progress: 7926 on 8158  Progress: 7927 on 8158  Progress: 7928 on 8158  Progress: 7929 on 8158  Progress: 7930 on 8158  Progress: 7931 on 8158  Progress: 7932 on 8158  Progress: 7933 on 8158  Progress: 7934 on 8158  Progress: 7935 on 8158  Progress: 7936 on 8158  Progress: 7937 on 8158  Progress: 7938 on 8158  Progress: 7939 on 8158  Progress: 7940 on 8158  Progress: 7941 on 8158  Progress: 7942 on 8158  Progress: 7943 on 8158  Progress: 7944 on 8158  Progress: 7945 on 8158  Progress: 7946 on 8158  Progress: 7947 on 8158  Progress: 7948 on 8158  Progress: 7949 on 8158  Progress: 7950 on 8158  Progress: 7951 on 8158  Progress: 7952 on 8158  Progress: 7953 on 8158  Progress: 7954 on 8158  Progress: 7955 on 8158  Progress: 7956 on 8158  Progress: 7957 on 8158  Progress: 7958 on 8158  Progress: 7959 on 8158  Progress: 7960 on 8158  Progress: 7961 on 8158  Progress: 7962 on 8158  Progress: 7963 on 8158  Progress: 7964 on 8158  Progress: 7965 on 8158  Progress: 7966 on 8158  Progress: 7967 on 8158  Progress: 7968 on 8158  Progress: 7969 on 8158  Progress: 7970 on 8158  Progress: 7971 on 8158  Progress: 7972 on 8158  Progress: 7973 on 8158  Progress: 7974 on 8158  Progress: 7975 on 8158  Progress: 7976 on 8158  Progress: 7977 on 8158  Progress: 7978 on 8158  Progress: 7979 on 8158  Progress: 7980 on 8158  Progress: 7981 on 8158  Progress: 7982 on 8158  Progress: 7983 on 8158  Progress: 7984 on 8158  Progress: 7985 on 8158  Progress: 7986 on 8158  Progress: 7987 on 8158  Progress: 7988 on 8158  Progress: 7989 on 8158  Progress: 7990 on 8158  Progress: 7991 on 8158  Progress: 7992 on 8158  Progress: 7993 on 8158  Progress: 7994 on 8158  Progress: 7995 on 8158  Progress: 7996 on 8158  Progress: 7997 on 8158  Progress: 7998 on 8158  Progress: 7999 on 8158  Progress: 8000 on 8158  Progress: 8001 on 8158  Progress: 8002 on 8158  Progress: 8003 on 8158  Progress: 8004 on 8158  Progress: 8005 on 8158  Progress: 8006 on 8158  Progress: 8007 on 8158  Progress: 8008 on 8158  Progress: 8009 on 8158  Progress: 8010 on 8158  Progress: 8011 on 8158  Progress: 8012 on 8158  Progress: 8013 on 8158  Progress: 8014 on 8158  Progress: 8015 on 8158  Progress: 8016 on 8158  Progress: 8017 on 8158  Progress: 8018 on 8158  Progress: 8019 on 8158  Progress: 8020 on 8158  Progress: 8021 on 8158  Progress: 8022 on 8158  Progress: 8023 on 8158  Progress: 8024 on 8158  Progress: 8025 on 8158  Progress: 8026 on 8158  Progress: 8027 on 8158  Progress: 8028 on 8158  Progress: 8029 on 8158  Progress: 8030 on 8158  Progress: 8031 on 8158  Progress: 8032 on 8158  Progress: 8033 on 8158  Progress: 8034 on 8158  Progress: 8035 on 8158  Progress: 8036 on 8158  Progress: 8037 on 8158  Progress: 8038 on 8158  Progress: 8039 on 8158  Progress: 8040 on 8158  Progress: 8041 on 8158  Progress: 8042 on 8158  Progress: 8043 on 8158  Progress: 8044 on 8158  Progress: 8045 on 8158  Progress: 8046 on 8158  Progress: 8047 on 8158  Progress: 8048 on 8158  Progress: 8049 on 8158  Progress: 8050 on 8158  Progress: 8051 on 8158  Progress: 8052 on 8158  Progress: 8053 on 8158  Progress: 8054 on 8158  Progress: 8055 on 8158  Progress: 8056 on 8158  Progress: 8057 on 8158  Progress: 8058 on 8158  Progress: 8059 on 8158  Progress: 8060 on 8158  Progress: 8061 on 8158  Progress: 8062 on 8158  Progress: 8063 on 8158  Progress: 8064 on 8158  Progress: 8065 on 8158  Progress: 8066 on 8158  Progress: 8067 on 8158  Progress: 8068 on 8158  Progress: 8069 on 8158  Progress: 8070 on 8158  Progress: 8071 on 8158  Progress: 8072 on 8158  Progress: 8073 on 8158  Progress: 8074 on 8158  Progress: 8075 on 8158  Progress: 8076 on 8158  Progress: 8077 on 8158  Progress: 8078 on 8158  Progress: 8079 on 8158  Progress: 8080 on 8158  Progress: 8081 on 8158  Progress: 8082 on 8158  Progress: 8083 on 8158  Progress: 8084 on 8158  Progress: 8085 on 8158  Progress: 8086 on 8158  Progress: 8087 on 8158  Progress: 8088 on 8158  Progress: 8089 on 8158  Progress: 8090 on 8158  Progress: 8091 on 8158  Progress: 8092 on 8158  Progress: 8093 on 8158  Progress: 8094 on 8158  Progress: 8095 on 8158  Progress: 8096 on 8158  Progress: 8097 on 8158  Progress: 8098 on 8158  Progress: 8099 on 8158  Progress: 8100 on 8158  Progress: 8101 on 8158  Progress: 8102 on 8158  Progress: 8103 on 8158  Progress: 8104 on 8158  Progress: 8105 on 8158  Progress: 8106 on 8158  Progress: 8107 on 8158  Progress: 8108 on 8158  Progress: 8109 on 8158  Progress: 8110 on 8158  Progress: 8111 on 8158  Progress: 8112 on 8158  Progress: 8113 on 8158  Progress: 8114 on 8158  Progress: 8115 on 8158  Progress: 8116 on 8158  Progress: 8117 on 8158  Progress: 8118 on 8158  Progress: 8119 on 8158  Progress: 8120 on 8158  Progress: 8121 on 8158  Progress: 8122 on 8158  Progress: 8123 on 8158  Progress: 8124 on 8158  Progress: 8125 on 8158  Progress: 8126 on 8158  Progress: 8127 on 8158  Progress: 8128 on 8158  Progress: 8129 on 8158  Progress: 8130 on 8158  Progress: 8131 on 8158  Progress: 8132 on 8158  Progress: 8133 on 8158  Progress: 8134 on 8158  Progress: 8135 on 8158  Progress: 8136 on 8158  Progress: 8137 on 8158  Progress: 8138 on 8158  Progress: 8139 on 8158  Progress: 8140 on 8158  Progress: 8141 on 8158  Progress: 8142 on 8158  Progress: 8143 on 8158  Progress: 8144 on 8158  Progress: 8145 on 8158  Progress: 8146 on 8158  Progress: 8147 on 8158  Progress: 8148 on 8158  Progress: 8149 on 8158  Progress: 8150 on 8158  Progress: 8151 on 8158  Progress: 8152 on 8158  Progress: 8153 on 8158  Progress: 8154 on 8158  Progress: 8155 on 8158  Progress: 8156 on 8158  Progress: 8157 on 8158  Progress: 8158 on 8158  
BN_autor <- BN_autor %>%
  mutate(ZA_ADNOTACJE = ifelse(czy_nazwisko==FALSE|czy_imie==FALSE,paste("UWAGA! Konflikt w danych osobowych w polach 100 i 245. Porównaj pole autor w formularzu z polem BN: ",X245c,sep = ""),NA)) %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,ZA_ADNOTACJE) %>%
  mutate(nazwa = str_replace_all(str_to_lower(paste(AM_NAZWISKO,AM_IMIE, sep = "")), "\\W", "")) %>%
  left_join(.,PBL_autorzy %>% select(AM_AUTOR_ID,AM_KRYPTONIM,AM_LICZBA_ZAPISOW,nazwa) %>% filter(is.na(AM_KRYPTONIM)),by="nazwa") %>%
  arrange(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,-AM_LICZBA_ZAPISOW)
BN_autor$id_grupy <- cumsum(!duplicated(BN_autor[1:3]))
BN_autor <- BN_autor[!duplicated(BN_autor$id_grupy),] %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,ZA_ADNOTACJE,AM_AUTOR_ID)

#3: tytuł
#pole 245
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
if("$n" %in% colnames(marc_field_245)) {
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = " "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = " "),
         `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = " "),
         `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  unite("ZA_TYTUL",`$a`:`$p`,sep = " ",na.rm = TRUE) %>% 
  mutate(ZA_TYTUL = str_replace_all(ZA_TYTUL," +"," "),
         ZA_TYTUL = str_remove(ZA_TYTUL, "\\s+\\/\\s{0,}$"),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = str_replace_all(ZA_TYTUL,"\\.{3} \\.{3}","... "),
         ZA_TYTUL = str_replace_all(ZA_TYTUL," ; ",". "),
         ZA_TYTUL = gsub("( : )(.)",". \\U\\2",perl=TRUE,ZA_TYTUL)) %>%
  select(ZA_UWAGI,ZA_TYTUL)
} else {
  marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,`$a`,`$b`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = " "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  unite("ZA_TYTUL",`$a`:`$b`,sep = " ",na.rm = TRUE) %>% 
  mutate(ZA_TYTUL = str_replace_all(ZA_TYTUL," +"," "),
         ZA_TYTUL = str_remove(ZA_TYTUL, "\\s+\\/\\s{0,}$"),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = str_replace_all(ZA_TYTUL,"\\.{3} \\.{3}","... "),
         ZA_TYTUL = str_replace_all(ZA_TYTUL," ; ",". "),
         ZA_TYTUL = gsub("( : )(.)",". \\U\\2",perl=TRUE,ZA_TYTUL)) %>%
  select(ZA_UWAGI,ZA_TYTUL)
}
#dopisanie gatunku do przedmiotowej na podstawie 655 i 650  
gatunki_pbl <- data.frame(gatunek = c("aforyzm", "album", "antologia", "autobiografia", "dziennik", "esej", "felieton", "inne", "kazanie", "list", "miniatura prozą", "opowiadanie", "poemat", "powieść", "proza", "proza poetycka", "reportaż", "rozmyślanie religijne", "rysunek, obraz", "scenariusz", "szkic", "tekst biblijny", "tekst dramatyczny", "dramat", "wiersz", "wspomnienia", "wypowiedź", "pamiętniki", "poezja", "literatura podróżnicza", "satyra", "piosenka"))

#dramat, pamiętniki, poezja, literatura podróżnicza, satyra, piosenka
gatunki_bn <- data %>%
  select(ZA_UWAGI,X655,X650)

gatunki_bn <- sqldf("select *
                    from gatunki_bn
                    left join gatunki_pbl on lower(gatunki_bn.X655) like '%'||gatunki_pbl.gatunek||'%'")
gatunki_bn <- sqldf("select *
                      from gatunki_bn
                      left join gatunki_pbl on lower(gatunki_bn.X650) like '%'||gatunki_pbl.gatunek||'%'")
colnames(gatunki_bn)[5] <- "gatunek2"
gatunki_bn <- gatunki_bn %>%
  mutate(gatunek = ifelse(is.na(gatunek)&!is.na(gatunek2),as.character(gatunek2),as.character(gatunek)),
         gatunek = ifelse(grepl("przypowieść",X655,ignore.case = TRUE)&!grepl("[^y]powieść",X655)&gatunek=="powieść","opowiadanie",as.character(gatunek))) %>%
  filter(!is.na(gatunek)) %>%
  select(ZA_UWAGI,gatunek) %>%
  mutate(gatunek = ifelse(gatunek=="dramat","tekst dramatyczny",
                          ifelse(gatunek=="pamiętniki","wspomnienia",
                                 ifelse(gatunek=="poezja","wiersz",
                                        ifelse(gatunek=="literatura podróżnicza","reportaż",
                                               ifelse(gatunek=="piosenka","wiersz",as.character(gatunek))))))) %>%
  group_by(ZA_UWAGI) %>%
  mutate(gatunek = paste(gatunek,collapse = ", ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(gatunek = gsub("(^.)","\\U\\1",perl = TRUE, gatunek))
#połączenie tytułu z gatunkiem
za_tytul <- marc_field_245 %>%
  left_join(.,gatunki_bn,by="ZA_UWAGI") %>% 
  mutate(gatunek = paste("[",gatunek,"]",sep = ""),
         gatunek = ifelse(gatunek=="[NA]",NA,as.character(gatunek))) %>% 
  unite("ZA_TYTUL", ZA_TYTUL:gatunek, sep = ". ",na.rm=TRUE) %>% 
  mutate(ZA_TYTUL = str_replace_all(ZA_TYTUL,"\\. \\.",". "),
         ZA_TYTUL = str_replace(ZA_TYTUL,"(\\!)(\\.)|(\\?)(\\.)","\\1"))

#4: tytuł oryginału
#pole 246
marc_field_246 <- data %>%
  select(ZA_UWAGI,X246)%>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"~"),
         X246=str_replace_all(X246,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X246",sep = "~",direction = "long") %>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"^\\|")) %>%
  mutate(indicator = str_replace_all(X246,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X246,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_246)[1]))
colnames(empty_table) <-subfield_list
marc_field_246<-cbind(marc_field_246,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_246$X246 <- str_replace(marc_field_246$X246,subfield_list_char[i],"|\\1")
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_246[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_246$X246),str_replace_all(gsub(string,"\\3",marc_field_246$X246),"\\${2}.", "~"),NA)
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
if("$n" %in% colnames(marc_field_246)) {
marc_field_246 <- marc_field_246[, colSums(is.na(marc_field_246)) != nrow(marc_field_246)] %>%
  filter(grepl("oryg",X246)) %>%
  select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = ", "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = ""),
         `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = ""),
         `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = "")) %>%
  ungroup() %>%
  unique() %>%
  unite("X246",`$a`:`$p`,sep = " ",na.rm = TRUE) %>% 
  mutate(X246 = str_replace_all(X246," +"," "),
         X246 = str_remove(X246, "\\s+\\/\\s{0,}$"),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X246),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( ){0,1}(.)",X246),gsub("(\\W)( )(:|;)( ){0,1}(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = str_replace_all(X246,"\\.{3} \\.{3}","... "),
         X246 = gsub("( : )(.)",". \\U\\2",perl=TRUE,X246)) %>%
  select(ZA_UWAGI, X246)
} else {
  marc_field_246 <- marc_field_246[, colSums(is.na(marc_field_246)) != nrow(marc_field_246)] %>%
  filter(grepl("oryg",X246)) %>%
  select(ZA_UWAGI,`$a`,`$b`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = ", "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = "")) %>%
  ungroup() %>%
  unique() %>%
  unite("X246",`$a`:`$b`,sep = " ",na.rm = TRUE) %>% 
  mutate(X246 = str_replace_all(X246," +"," "),
         X246 = str_remove(X246, "\\s+\\/\\s{0,}$"),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X246),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( ){0,1}(.)",X246),gsub("(\\W)( )(:|;)( ){0,1}(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = str_replace_all(X246,"\\.{3} \\.{3}","... "),
         X246 = gsub("( : )(.)",". \\U\\2",perl=TRUE,X246)) %>%
  select(ZA_UWAGI, X246)
}

#pole 500
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"~"),
         X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
marc_field_500 <- marc_field_500 %>%
  filter(grepl("oryg\\.\\:",X500)) %>%
  mutate(X500 = str_remove(`$a`,"^Tyt\\. oryg\\.: |^Tyt\\, oryg\\.: |^.*?tyt\\. oryg\\.: "),
         X500 = str_remove(X500, "\\s+\\/\\s{0,}$"),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = str_replace_all(X500,"\\.{3} \\.{3}","... "),
         X500 = str_remove(X500, "\\.$"),
         X500 = str_remove(X500,"(,{0,1} {0,1})\\d{4}.*$|(, t|. T)yt. oryg. cyklu:")) %>%
  select(ZA_UWAGI,X500)
#tytuł oryginału
za_tytul_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_246,by="ZA_UWAGI") %>%
  left_join(.,marc_field_500,by="ZA_UWAGI") %>%
  mutate(X500 = ifelse(is.na(X500),NA,
                       ifelse(grepl("oryg",X500),NA,as.character(X500))),
         X500 = ifelse(!is.na(X500)&grepl("\\. - ",X500),str_replace(X500,"(.*?)(\\. - .*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Na książce pseud",X500),str_replace(X500,"(.*?)(\\. Na książce pseud.*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Przekł\\. wg",X500),str_replace(X500,"(.*?)(\\. Przekł\\. wg.*$)","\\1"),as.character(X500)),
         ZA_TYTUL_ORYGINALU = ifelse(is.na(X246)&is.na(X500),NA,
                                     ifelse(!is.na(X500),as.character(X500),as.character(X246))),
         ZA_TYTUL_ORYGINALU = str_remove_all(ZA_TYTUL_ORYGINALU,'\\"')) %>%
  select(ZA_UWAGI,ZA_TYTUL_ORYGINALU)
#5: język oryginału
marc_field_041 <- data %>%
  select(ZA_UWAGI,X041)%>%
  filter(X041!="") %>%
  mutate(X041=str_replace_all(X041,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X041",sep = "~",direction = "long") %>%
  filter(X041!="") %>%
  mutate(X041=str_remove_all(X041,"^\\|")) %>%
  mutate(indicator = str_replace_all(X041,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X041,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_041)[1]))
colnames(empty_table) <-subfield_list
marc_field_041<-cbind(marc_field_041,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_041$X041 <- str_replace(marc_field_041$X041,subfield_list_char[i],"|\\1")
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_041[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_041$X041),str_replace_all(gsub(string,"\\3",marc_field_041$X041),"\\${2}.", "~"),NA)
}
Progress: 1 on 7  Progress: 2 on 7  Progress: 3 on 7  Progress: 4 on 7  Progress: 5 on 7  Progress: 6 on 7  Progress: 7 on 7  
za_jezyk_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_041 %>% select(ZA_UWAGI,ZA_JEZYK_ORYGINALU = `$a`),by="ZA_UWAGI") %>%
  mutate(ZA_JEZYK_ORYGINALU = str_replace_all(ZA_JEZYK_ORYGINALU,"\\$a",",")) %>%
  unique()

#6: współtwórcy
marc_field_700 <- data %>%
  select(ZA_UWAGI,X700)%>%
  filter(X700!="") %>%
  mutate(X700=str_replace_all(X700,"(..\\$a)","|\\1"),
         X700=str_replace_all(X700,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X700",sep = "~",direction = "long") %>%
  filter(X700!="") %>%
  mutate(X700=str_remove_all(X700,"^\\|")) %>%
  mutate(indicator = str_replace_all(X700,"(^.*?)(\\$.*)","\\1")) %>%
  filter(X700!="")
subfield_list<- str_extract_all(data$X700,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_700)[1]))
colnames(empty_table) <-subfield_list
marc_field_700<-cbind(marc_field_700,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_700$X700 <- str_replace(marc_field_700$X700,subfield_list_char[i],"|\\1")
}
Progress:  1 on 10  Progress:  2 on 10  Progress:  3 on 10  Progress:  4 on 10  Progress:  5 on 10  Progress:  6 on 10  Progress:  7 on 10  Progress:  8 on 10  Progress:  9 on 10  Progress: 10 on 10  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_700[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_700$X700),str_replace_all(gsub(string,"\\3",marc_field_700$X700),"\\${2}.", "~"),NA)
}
Progress:  1 on 10  Progress:  2 on 10  Progress:  3 on 10  Progress:  4 on 10  Progress:  5 on 10  Progress:  6 on 10  Progress:  7 on 10  Progress:  8 on 10  Progress:  9 on 10  Progress: 10 on 10  
BN_wspoltworca <- marc_field_700 %>%
  select(ZA_UWAGI,osoba = `$a`,funkcja = `$e`) %>%
  filter(!is.na(funkcja)) %>%
  mutate(osoba = str_remove(osoba,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)"),
         OS_NAZWISKO = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\1"),as.character(osoba)),
         OS_IMIE = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\3"),"*"),
         ws_prosty = str_replace_all(str_to_lower(osoba), "\\W", ""),
         fu_prosta = str_replace_all(str_to_lower(funkcja), "\\W", "")) %>%
  left_join(.,PBL_wspoltworcy %>% select(OS_OSOBA_ID,OS_LICZBA_ZAPISOW,nazwa_prosta),by=c("ws_prosty"="nazwa_prosta")) %>%
  arrange(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,-OS_LICZBA_ZAPISOW)
BN_wspoltworca$id_grupy <- cumsum(!duplicated(BN_wspoltworca[1:2]))
BN_wspoltworca <- BN_wspoltworca[!duplicated(BN_wspoltworca$id_grupy),] %>%
  left_join(.,PBL_funkcje,by=c("fu_prosta"="nazwa")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL",NA,as.character(fo_symbol))) %>%
  select(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,OS_OSOBA_ID,fo_symbol,fo_nazwa,funkcja)

#tutaj przeszukać X245 i znaleźć błędy współtwórców
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,X245c=`$c`)

BN_wspoltworca <- BN_wspoltworca %>%
  left_join(.,marc_field_245,by="ZA_UWAGI")

x <- 1:lengths(BN_wspoltworca[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  BN_wspoltworca$czy_nazwisko[i] <- str_detect(BN_wspoltworca$X245c[i],BN_wspoltworca$OS_NAZWISKO[i])
  BN_wspoltworca$czy_imie[i] <- grepl(BN_wspoltworca$OS_IMIE[i],BN_wspoltworca$X245c[i])
}
Progress:    1 on 5890  Progress:    2 on 5890  Progress:    3 on 5890  Progress:    4 on 5890  Progress:    5 on 5890  Progress:    6 on 5890  Progress:    7 on 5890  Progress:    8 on 5890  Progress:    9 on 5890  Progress:   10 on 5890  Progress:   11 on 5890  Progress:   12 on 5890  Progress:   13 on 5890  Progress:   14 on 5890  Progress:   15 on 5890  Progress:   16 on 5890  Progress:   17 on 5890  Progress:   18 on 5890  Progress:   19 on 5890  Progress:   20 on 5890  Progress:   21 on 5890  Progress:   22 on 5890  Progress:   23 on 5890  Progress:   24 on 5890  Progress:   25 on 5890  Progress:   26 on 5890  Progress:   27 on 5890  Progress:   28 on 5890  Progress:   29 on 5890  Progress:   30 on 5890  Progress:   31 on 5890  Progress:   32 on 5890  Progress:   33 on 5890  Progress:   34 on 5890  Progress:   35 on 5890  Progress:   36 on 5890  Progress:   37 on 5890  Progress:   38 on 5890  Progress:   39 on 5890  Progress:   40 on 5890  Progress:   41 on 5890  Progress:   42 on 5890  Progress:   43 on 5890  Progress:   44 on 5890  Progress:   45 on 5890  Progress:   46 on 5890  Progress:   47 on 5890  Progress:   48 on 5890  Progress:   49 on 5890  Progress:   50 on 5890  Progress:   51 on 5890  Progress:   52 on 5890  Progress:   53 on 5890  Progress:   54 on 5890  Progress:   55 on 5890  Progress:   56 on 5890  Progress:   57 on 5890  Progress:   58 on 5890  Progress:   59 on 5890  Progress:   60 on 5890  Progress:   61 on 5890  Progress:   62 on 5890  Progress:   63 on 5890  Progress:   64 on 5890  Progress:   65 on 5890  Progress:   66 on 5890  Progress:   67 on 5890  Progress:   68 on 5890  Progress:   69 on 5890  Progress:   70 on 5890  Progress:   71 on 5890  Progress:   72 on 5890  Progress:   73 on 5890  Progress:   74 on 5890  Progress:   75 on 5890  Progress:   76 on 5890  Progress:   77 on 5890  Progress:   78 on 5890  Progress:   79 on 5890  Progress:   80 on 5890  Progress:   81 on 5890  Progress:   82 on 5890  Progress:   83 on 5890  Progress:   84 on 5890  Progress:   85 on 5890  Progress:   86 on 5890  Progress:   87 on 5890  Progress:   88 on 5890  Progress:   89 on 5890  Progress:   90 on 5890  Progress:   91 on 5890  Progress:   92 on 5890  Progress:   93 on 5890  Progress:   94 on 5890  Progress:   95 on 5890  Progress:   96 on 5890  Progress:   97 on 5890  Progress:   98 on 5890  Progress:   99 on 5890  Progress:  100 on 5890  Progress:  101 on 5890  Progress:  102 on 5890  Progress:  103 on 5890  Progress:  104 on 5890  Progress:  105 on 5890  Progress:  106 on 5890  Progress:  107 on 5890  Progress:  108 on 5890  Progress:  109 on 5890  Progress:  110 on 5890  Progress:  111 on 5890  Progress:  112 on 5890  Progress:  113 on 5890  Progress:  114 on 5890  Progress:  115 on 5890  Progress:  116 on 5890  Progress:  117 on 5890  Progress:  118 on 5890  Progress:  119 on 5890  Progress:  120 on 5890  Progress:  121 on 5890  Progress:  122 on 5890  Progress:  123 on 5890  Progress:  124 on 5890  Progress:  125 on 5890  Progress:  126 on 5890  Progress:  127 on 5890  Progress:  128 on 5890  Progress:  129 on 5890  Progress:  130 on 5890  Progress:  131 on 5890  Progress:  132 on 5890  Progress:  133 on 5890  Progress:  134 on 5890  Progress:  135 on 5890  Progress:  136 on 5890  Progress:  137 on 5890  Progress:  138 on 5890  Progress:  139 on 5890  Progress:  140 on 5890  Progress:  141 on 5890  Progress:  142 on 5890  Progress:  143 on 5890  Progress:  144 on 5890  Progress:  145 on 5890  Progress:  146 on 5890  Progress:  147 on 5890  Progress:  148 on 5890  Progress:  149 on 5890  Progress:  150 on 5890  Progress:  151 on 5890  Progress:  152 on 5890  Progress:  153 on 5890  Progress:  154 on 5890  Progress:  155 on 5890  Progress:  156 on 5890  Progress:  157 on 5890  Progress:  158 on 5890  Progress:  159 on 5890  Progress:  160 on 5890  Progress:  161 on 5890  Progress:  162 on 5890  Progress:  163 on 5890  Progress:  164 on 5890  Progress:  165 on 5890  Progress:  166 on 5890  Progress:  167 on 5890  Progress:  168 on 5890  Progress:  169 on 5890  Progress:  170 on 5890  Progress:  171 on 5890  Progress:  172 on 5890  Progress:  173 on 5890  Progress:  174 on 5890  Progress:  175 on 5890  Progress:  176 on 5890  Progress:  177 on 5890  Progress:  178 on 5890  Progress:  179 on 5890  Progress:  180 on 5890  Progress:  181 on 5890  Progress:  182 on 5890  Progress:  183 on 5890  Progress:  184 on 5890  Progress:  185 on 5890  Progress:  186 on 5890  Progress:  187 on 5890  Progress:  188 on 5890  Progress:  189 on 5890  Progress:  190 on 5890  Progress:  191 on 5890  Progress:  192 on 5890  Progress:  193 on 5890  Progress:  194 on 5890  Progress:  195 on 5890  Progress:  196 on 5890  Progress:  197 on 5890  Progress:  198 on 5890  Progress:  199 on 5890  Progress:  200 on 5890  Progress:  201 on 5890  Progress:  202 on 5890  Progress:  203 on 5890  Progress:  204 on 5890  Progress:  205 on 5890  Progress:  206 on 5890  Progress:  207 on 5890  Progress:  208 on 5890  Progress:  209 on 5890  Progress:  210 on 5890  Progress:  211 on 5890  Progress:  212 on 5890  Progress:  213 on 5890  Progress:  214 on 5890  Progress:  215 on 5890  Progress:  216 on 5890  Progress:  217 on 5890  Progress:  218 on 5890  Progress:  219 on 5890  Progress:  220 on 5890  Progress:  221 on 5890  Progress:  222 on 5890  Progress:  223 on 5890  Progress:  224 on 5890  Progress:  225 on 5890  Progress:  226 on 5890  Progress:  227 on 5890  Progress:  228 on 5890  Progress:  229 on 5890  Progress:  230 on 5890  Progress:  231 on 5890  Progress:  232 on 5890  Progress:  233 on 5890  Progress:  234 on 5890  Progress:  235 on 5890  Progress:  236 on 5890  Progress:  237 on 5890  Progress:  238 on 5890  Progress:  239 on 5890  Progress:  240 on 5890  Progress:  241 on 5890  Progress:  242 on 5890  Progress:  243 on 5890  Progress:  244 on 5890  Progress:  245 on 5890  Progress:  246 on 5890  Progress:  247 on 5890  Progress:  248 on 5890  Progress:  249 on 5890  Progress:  250 on 5890  Progress:  251 on 5890  Progress:  252 on 5890  Progress:  253 on 5890  Progress:  254 on 5890  Progress:  255 on 5890  Progress:  256 on 5890  Progress:  257 on 5890  Progress:  258 on 5890  Progress:  259 on 5890  Progress:  260 on 5890  Progress:  261 on 5890  Progress:  262 on 5890  Progress:  263 on 5890  Progress:  264 on 5890  Progress:  265 on 5890  Progress:  266 on 5890  Progress:  267 on 5890  Progress:  268 on 5890  Progress:  269 on 5890  Progress:  270 on 5890  Progress:  271 on 5890  Progress:  272 on 5890  Progress:  273 on 5890  Progress:  274 on 5890  Progress:  275 on 5890  Progress:  276 on 5890  Progress:  277 on 5890  Progress:  278 on 5890  Progress:  279 on 5890  Progress:  280 on 5890  Progress:  281 on 5890  Progress:  282 on 5890  Progress:  283 on 5890  Progress:  284 on 5890  Progress:  285 on 5890  Progress:  286 on 5890  Progress:  287 on 5890  Progress:  288 on 5890  Progress:  289 on 5890  Progress:  290 on 5890  Progress:  291 on 5890  Progress:  292 on 5890  Progress:  293 on 5890  Progress:  294 on 5890  Progress:  295 on 5890  Progress:  296 on 5890  Progress:  297 on 5890  Progress:  298 on 5890  Progress:  299 on 5890  Progress:  300 on 5890  Progress:  301 on 5890  Progress:  302 on 5890  Progress:  303 on 5890  Progress:  304 on 5890  Progress:  305 on 5890  Progress:  306 on 5890  Progress:  307 on 5890  Progress:  308 on 5890  Progress:  309 on 5890  Progress:  310 on 5890  Progress:  311 on 5890  Progress:  312 on 5890  Progress:  313 on 5890  Progress:  314 on 5890  Progress:  315 on 5890  Progress:  316 on 5890  Progress:  317 on 5890  Progress:  318 on 5890  Progress:  319 on 5890  Progress:  320 on 5890  Progress:  321 on 5890  Progress:  322 on 5890  Progress:  323 on 5890  Progress:  324 on 5890  Progress:  325 on 5890  Progress:  326 on 5890  Progress:  327 on 5890  Progress:  328 on 5890  Progress:  329 on 5890  Progress:  330 on 5890  Progress:  331 on 5890  Progress:  332 on 5890  Progress:  333 on 5890  Progress:  334 on 5890  Progress:  335 on 5890  Progress:  336 on 5890  Progress:  337 on 5890  Progress:  338 on 5890  Progress:  339 on 5890  Progress:  340 on 5890  Progress:  341 on 5890  Progress:  342 on 5890  Progress:  343 on 5890  Progress:  344 on 5890  Progress:  345 on 5890  Progress:  346 on 5890  Progress:  347 on 5890  Progress:  348 on 5890  Progress:  349 on 5890  Progress:  350 on 5890  Progress:  351 on 5890  Progress:  352 on 5890  Progress:  353 on 5890  Progress:  354 on 5890  Progress:  355 on 5890  Progress:  356 on 5890  Progress:  357 on 5890  Progress:  358 on 5890  Progress:  359 on 5890  Progress:  360 on 5890  Progress:  361 on 5890  Progress:  362 on 5890  Progress:  363 on 5890  Progress:  364 on 5890  Progress:  365 on 5890  Progress:  366 on 5890  Progress:  367 on 5890  Progress:  368 on 5890  Progress:  369 on 5890  Progress:  370 on 5890  Progress:  371 on 5890  Progress:  372 on 5890  Progress:  373 on 5890  Progress:  374 on 5890  Progress:  375 on 5890  Progress:  376 on 5890  Progress:  377 on 5890  Progress:  378 on 5890  Progress:  379 on 5890  Progress:  380 on 5890  Progress:  381 on 5890  Progress:  382 on 5890  Progress:  383 on 5890  Progress:  384 on 5890  Progress:  385 on 5890  Progress:  386 on 5890  Progress:  387 on 5890  Progress:  388 on 5890  Progress:  389 on 5890  Progress:  390 on 5890  Progress:  391 on 5890  Progress:  392 on 5890  Progress:  393 on 5890  Progress:  394 on 5890  Progress:  395 on 5890  Progress:  396 on 5890  Progress:  397 on 5890  Progress:  398 on 5890  Progress:  399 on 5890  Progress:  400 on 5890  Progress:  401 on 5890  Progress:  402 on 5890  Progress:  403 on 5890  Progress:  404 on 5890  Progress:  405 on 5890  Progress:  406 on 5890  Progress:  407 on 5890  Progress:  408 on 5890  Progress:  409 on 5890  Progress:  410 on 5890  Progress:  411 on 5890  Progress:  412 on 5890  Progress:  413 on 5890  Progress:  414 on 5890  Progress:  415 on 5890  Progress:  416 on 5890  Progress:  417 on 5890  Progress:  418 on 5890  Progress:  419 on 5890  Progress:  420 on 5890  Progress:  421 on 5890  Progress:  422 on 5890  Progress:  423 on 5890  Progress:  424 on 5890  Progress:  425 on 5890  Progress:  426 on 5890  Progress:  427 on 5890  Progress:  428 on 5890  Progress:  429 on 5890  Progress:  430 on 5890  Progress:  431 on 5890  Progress:  432 on 5890  Progress:  433 on 5890  Progress:  434 on 5890  Progress:  435 on 5890  Progress:  436 on 5890  Progress:  437 on 5890  Progress:  438 on 5890  Progress:  439 on 5890  Progress:  440 on 5890  Progress:  441 on 5890  Progress:  442 on 5890  Progress:  443 on 5890  Progress:  444 on 5890  Progress:  445 on 5890  Progress:  446 on 5890  Progress:  447 on 5890  Progress:  448 on 5890  Progress:  449 on 5890  Progress:  450 on 5890  Progress:  451 on 5890  Progress:  452 on 5890  Progress:  453 on 5890  Progress:  454 on 5890  Progress:  455 on 5890  Progress:  456 on 5890  Progress:  457 on 5890  Progress:  458 on 5890  Progress:  459 on 5890  Progress:  460 on 5890  Progress:  461 on 5890  Progress:  462 on 5890  Progress:  463 on 5890  Progress:  464 on 5890  Progress:  465 on 5890  Progress:  466 on 5890  Progress:  467 on 5890  Progress:  468 on 5890  Progress:  469 on 5890  Progress:  470 on 5890  Progress:  471 on 5890  Progress:  472 on 5890  Progress:  473 on 5890  Progress:  474 on 5890  Progress:  475 on 5890  Progress:  476 on 5890  Progress:  477 on 5890  Progress:  478 on 5890  Progress:  479 on 5890  Progress:  480 on 5890  Progress:  481 on 5890  Progress:  482 on 5890  Progress:  483 on 5890  Progress:  484 on 5890  Progress:  485 on 5890  Progress:  486 on 5890  Progress:  487 on 5890  Progress:  488 on 5890  Progress:  489 on 5890  Progress:  490 on 5890  Progress:  491 on 5890  Progress:  492 on 5890  Progress:  493 on 5890  Progress:  494 on 5890  Progress:  495 on 5890  Progress:  496 on 5890  Progress:  497 on 5890  Progress:  498 on 5890  Progress:  499 on 5890  Progress:  500 on 5890  Progress:  501 on 5890  Progress:  502 on 5890  Progress:  503 on 5890  Progress:  504 on 5890  Progress:  505 on 5890  Progress:  506 on 5890  Progress:  507 on 5890  Progress:  508 on 5890  Progress:  509 on 5890  Progress:  510 on 5890  Progress:  511 on 5890  Progress:  512 on 5890  Progress:  513 on 5890  Progress:  514 on 5890  Progress:  515 on 5890  Progress:  516 on 5890  Progress:  517 on 5890  Progress:  518 on 5890  Progress:  519 on 5890  Progress:  520 on 5890  Progress:  521 on 5890  Progress:  522 on 5890  Progress:  523 on 5890  Progress:  524 on 5890  Progress:  525 on 5890  Progress:  526 on 5890  Progress:  527 on 5890  Progress:  528 on 5890  Progress:  529 on 5890  Progress:  530 on 5890  Progress:  531 on 5890  Progress:  532 on 5890  Progress:  533 on 5890  Progress:  534 on 5890  Progress:  535 on 5890  Progress:  536 on 5890  Progress:  537 on 5890  Progress:  538 on 5890  Progress:  539 on 5890  Progress:  540 on 5890  Progress:  541 on 5890  Progress:  542 on 5890  Progress:  543 on 5890  Progress:  544 on 5890  Progress:  545 on 5890  Progress:  546 on 5890  Progress:  547 on 5890  Progress:  548 on 5890  Progress:  549 on 5890  Progress:  550 on 5890  Progress:  551 on 5890  Progress:  552 on 5890  Progress:  553 on 5890  Progress:  554 on 5890  Progress:  555 on 5890  Progress:  556 on 5890  Progress:  557 on 5890  Progress:  558 on 5890  Progress:  559 on 5890  Progress:  560 on 5890  Progress:  561 on 5890  Progress:  562 on 5890  Progress:  563 on 5890  Progress:  564 on 5890  Progress:  565 on 5890  Progress:  566 on 5890  Progress:  567 on 5890  Progress:  568 on 5890  Progress:  569 on 5890  Progress:  570 on 5890  Progress:  571 on 5890  Progress:  572 on 5890  Progress:  573 on 5890  Progress:  574 on 5890  Progress:  575 on 5890  Progress:  576 on 5890  Progress:  577 on 5890  Progress:  578 on 5890  Progress:  579 on 5890  Progress:  580 on 5890  Progress:  581 on 5890  Progress:  582 on 5890  Progress:  583 on 5890  Progress:  584 on 5890  Progress:  585 on 5890  Progress:  586 on 5890  Progress:  587 on 5890  Progress:  588 on 5890  Progress:  589 on 5890  Progress:  590 on 5890  Progress:  591 on 5890  Progress:  592 on 5890  Progress:  593 on 5890  Progress:  594 on 5890  Progress:  595 on 5890  Progress:  596 on 5890  Progress:  597 on 5890  Progress:  598 on 5890  Progress:  599 on 5890  Progress:  600 on 5890  Progress:  601 on 5890  Progress:  602 on 5890  Progress:  603 on 5890  Progress:  604 on 5890  Progress:  605 on 5890  Progress:  606 on 5890  Progress:  607 on 5890  Progress:  608 on 5890  Progress:  609 on 5890  Progress:  610 on 5890  Progress:  611 on 5890  Progress:  612 on 5890  Progress:  613 on 5890  Progress:  614 on 5890  Progress:  615 on 5890  Progress:  616 on 5890  Progress:  617 on 5890  Progress:  618 on 5890  Progress:  619 on 5890  Progress:  620 on 5890  Progress:  621 on 5890  Progress:  622 on 5890  Progress:  623 on 5890  Progress:  624 on 5890  Progress:  625 on 5890  Progress:  626 on 5890  Progress:  627 on 5890  Progress:  628 on 5890  Progress:  629 on 5890  Progress:  630 on 5890  Progress:  631 on 5890  Progress:  632 on 5890  Progress:  633 on 5890  Progress:  634 on 5890  Progress:  635 on 5890  Progress:  636 on 5890  Progress:  637 on 5890  Progress:  638 on 5890  Progress:  639 on 5890  Progress:  640 on 5890  Progress:  641 on 5890  Progress:  642 on 5890  Progress:  643 on 5890  Progress:  644 on 5890  Progress:  645 on 5890  Progress:  646 on 5890  Progress:  647 on 5890  Progress:  648 on 5890  Progress:  649 on 5890  Progress:  650 on 5890  Progress:  651 on 5890  Progress:  652 on 5890  Progress:  653 on 5890  Progress:  654 on 5890  Progress:  655 on 5890  Progress:  656 on 5890  Progress:  657 on 5890  Progress:  658 on 5890  Progress:  659 on 5890  Progress:  660 on 5890  Progress:  661 on 5890  Progress:  662 on 5890  Progress:  663 on 5890  Progress:  664 on 5890  Progress:  665 on 5890  Progress:  666 on 5890  Progress:  667 on 5890  Progress:  668 on 5890  Progress:  669 on 5890  Progress:  670 on 5890  Progress:  671 on 5890  Progress:  672 on 5890  Progress:  673 on 5890  Progress:  674 on 5890  Progress:  675 on 5890  Progress:  676 on 5890  Progress:  677 on 5890  Progress:  678 on 5890  Progress:  679 on 5890  Progress:  680 on 5890  Progress:  681 on 5890  Progress:  682 on 5890  Progress:  683 on 5890  Progress:  684 on 5890  Progress:  685 on 5890  Progress:  686 on 5890  Progress:  687 on 5890  Progress:  688 on 5890  Progress:  689 on 5890  Progress:  690 on 5890  Progress:  691 on 5890  Progress:  692 on 5890  Progress:  693 on 5890  Progress:  694 on 5890  Progress:  695 on 5890  Progress:  696 on 5890  Progress:  697 on 5890  Progress:  698 on 5890  Progress:  699 on 5890  Progress:  700 on 5890  Progress:  701 on 5890  Progress:  702 on 5890  Progress:  703 on 5890  Progress:  704 on 5890  Progress:  705 on 5890  Progress:  706 on 5890  Progress:  707 on 5890  Progress:  708 on 5890  Progress:  709 on 5890  Progress:  710 on 5890  Progress:  711 on 5890  Progress:  712 on 5890  Progress:  713 on 5890  Progress:  714 on 5890  Progress:  715 on 5890  Progress:  716 on 5890  Progress:  717 on 5890  Progress:  718 on 5890  Progress:  719 on 5890  Progress:  720 on 5890  Progress:  721 on 5890  Progress:  722 on 5890  Progress:  723 on 5890  Progress:  724 on 5890  Progress:  725 on 5890  Progress:  726 on 5890  Progress:  727 on 5890  Progress:  728 on 5890  Progress:  729 on 5890  Progress:  730 on 5890  Progress:  731 on 5890  Progress:  732 on 5890  Progress:  733 on 5890  Progress:  734 on 5890  Progress:  735 on 5890  Progress:  736 on 5890  Progress:  737 on 5890  Progress:  738 on 5890  Progress:  739 on 5890  Progress:  740 on 5890  Progress:  741 on 5890  Progress:  742 on 5890  Progress:  743 on 5890  Progress:  744 on 5890  Progress:  745 on 5890  Progress:  746 on 5890  Progress:  747 on 5890  Progress:  748 on 5890  Progress:  749 on 5890  Progress:  750 on 5890  Progress:  751 on 5890  Progress:  752 on 5890  Progress:  753 on 5890  Progress:  754 on 5890  Progress:  755 on 5890  Progress:  756 on 5890  Progress:  757 on 5890  Progress:  758 on 5890  Progress:  759 on 5890  Progress:  760 on 5890  Progress:  761 on 5890  Progress:  762 on 5890  Progress:  763 on 5890  Progress:  764 on 5890  Progress:  765 on 5890  Progress:  766 on 5890  Progress:  767 on 5890  Progress:  768 on 5890  Progress:  769 on 5890  Progress:  770 on 5890  Progress:  771 on 5890  Progress:  772 on 5890  Progress:  773 on 5890  Progress:  774 on 5890  Progress:  775 on 5890  Progress:  776 on 5890  Progress:  777 on 5890  Progress:  778 on 5890  Progress:  779 on 5890  Progress:  780 on 5890  Progress:  781 on 5890  Progress:  782 on 5890  Progress:  783 on 5890  Progress:  784 on 5890  Progress:  785 on 5890  Progress:  786 on 5890  Progress:  787 on 5890  Progress:  788 on 5890  Progress:  789 on 5890  Progress:  790 on 5890  Progress:  791 on 5890  Progress:  792 on 5890  Progress:  793 on 5890  Progress:  794 on 5890  Progress:  795 on 5890  Progress:  796 on 5890  Progress:  797 on 5890  Progress:  798 on 5890  Progress:  799 on 5890  Progress:  800 on 5890  Progress:  801 on 5890  Progress:  802 on 5890  Progress:  803 on 5890  Progress:  804 on 5890  Progress:  805 on 5890  Progress:  806 on 5890  Progress:  807 on 5890  Progress:  808 on 5890  Progress:  809 on 5890  Progress:  810 on 5890  Progress:  811 on 5890  Progress:  812 on 5890  Progress:  813 on 5890  Progress:  814 on 5890  Progress:  815 on 5890  Progress:  816 on 5890  Progress:  817 on 5890  Progress:  818 on 5890  Progress:  819 on 5890  Progress:  820 on 5890  Progress:  821 on 5890  Progress:  822 on 5890  Progress:  823 on 5890  Progress:  824 on 5890  Progress:  825 on 5890  Progress:  826 on 5890  Progress:  827 on 5890  Progress:  828 on 5890  Progress:  829 on 5890  Progress:  830 on 5890  Progress:  831 on 5890  Progress:  832 on 5890  Progress:  833 on 5890  Progress:  834 on 5890  Progress:  835 on 5890  Progress:  836 on 5890  Progress:  837 on 5890  Progress:  838 on 5890  Progress:  839 on 5890  Progress:  840 on 5890  Progress:  841 on 5890  Progress:  842 on 5890  Progress:  843 on 5890  Progress:  844 on 5890  Progress:  845 on 5890  Progress:  846 on 5890  Progress:  847 on 5890  Progress:  848 on 5890  Progress:  849 on 5890  Progress:  850 on 5890  Progress:  851 on 5890  Progress:  852 on 5890  Progress:  853 on 5890  Progress:  854 on 5890  Progress:  855 on 5890  Progress:  856 on 5890  Progress:  857 on 5890  Progress:  858 on 5890  Progress:  859 on 5890  Progress:  860 on 5890  Progress:  861 on 5890  Progress:  862 on 5890  Progress:  863 on 5890  Progress:  864 on 5890  Progress:  865 on 5890  Progress:  866 on 5890  Progress:  867 on 5890  Progress:  868 on 5890  Progress:  869 on 5890  Progress:  870 on 5890  Progress:  871 on 5890  Progress:  872 on 5890  Progress:  873 on 5890  Progress:  874 on 5890  Progress:  875 on 5890  Progress:  876 on 5890  Progress:  877 on 5890  Progress:  878 on 5890  Progress:  879 on 5890  Progress:  880 on 5890  Progress:  881 on 5890  Progress:  882 on 5890  Progress:  883 on 5890  Progress:  884 on 5890  Progress:  885 on 5890  Progress:  886 on 5890  Progress:  887 on 5890  Progress:  888 on 5890  Progress:  889 on 5890  Progress:  890 on 5890  Progress:  891 on 5890  Progress:  892 on 5890  Progress:  893 on 5890  Progress:  894 on 5890  Progress:  895 on 5890  Progress:  896 on 5890  Progress:  897 on 5890  Progress:  898 on 5890  Progress:  899 on 5890  Progress:  900 on 5890  Progress:  901 on 5890  Progress:  902 on 5890  Progress:  903 on 5890  Progress:  904 on 5890  Progress:  905 on 5890  Progress:  906 on 5890  Progress:  907 on 5890  Progress:  908 on 5890  Progress:  909 on 5890  Progress:  910 on 5890  Progress:  911 on 5890  Progress:  912 on 5890  Progress:  913 on 5890  Progress:  914 on 5890  Progress:  915 on 5890  Progress:  916 on 5890  Progress:  917 on 5890  Progress:  918 on 5890  Progress:  919 on 5890  Progress:  920 on 5890  Progress:  921 on 5890  Progress:  922 on 5890  Progress:  923 on 5890  Progress:  924 on 5890  Progress:  925 on 5890  Progress:  926 on 5890  Progress:  927 on 5890  Progress:  928 on 5890  Progress:  929 on 5890  Progress:  930 on 5890  Progress:  931 on 5890  Progress:  932 on 5890  Progress:  933 on 5890  Progress:  934 on 5890  Progress:  935 on 5890  Progress:  936 on 5890  Progress:  937 on 5890  Progress:  938 on 5890  Progress:  939 on 5890  Progress:  940 on 5890  Progress:  941 on 5890  Progress:  942 on 5890  Progress:  943 on 5890  Progress:  944 on 5890  Progress:  945 on 5890  Progress:  946 on 5890  Progress:  947 on 5890  Progress:  948 on 5890  Progress:  949 on 5890  Progress:  950 on 5890  Progress:  951 on 5890  Progress:  952 on 5890  Progress:  953 on 5890  Progress:  954 on 5890  Progress:  955 on 5890  Progress:  956 on 5890  Progress:  957 on 5890  Progress:  958 on 5890  Progress:  959 on 5890  Progress:  960 on 5890  Progress:  961 on 5890  Progress:  962 on 5890  Progress:  963 on 5890  Progress:  964 on 5890  Progress:  965 on 5890  Progress:  966 on 5890  Progress:  967 on 5890  Progress:  968 on 5890  Progress:  969 on 5890  Progress:  970 on 5890  Progress:  971 on 5890  Progress:  972 on 5890  Progress:  973 on 5890  Progress:  974 on 5890  Progress:  975 on 5890  Progress:  976 on 5890  Progress:  977 on 5890  Progress:  978 on 5890  Progress:  979 on 5890  Progress:  980 on 5890  Progress:  981 on 5890  Progress:  982 on 5890  Progress:  983 on 5890  Progress:  984 on 5890  Progress:  985 on 5890  Progress:  986 on 5890  Progress:  987 on 5890  Progress:  988 on 5890  Progress:  989 on 5890  Progress:  990 on 5890  Progress:  991 on 5890  Progress:  992 on 5890  Progress:  993 on 5890  Progress:  994 on 5890  Progress:  995 on 5890  Progress:  996 on 5890  Progress:  997 on 5890  Progress:  998 on 5890  Progress:  999 on 5890  Progress: 1000 on 5890  Progress: 1001 on 5890  Progress: 1002 on 5890  Progress: 1003 on 5890  Progress: 1004 on 5890  Progress: 1005 on 5890  Progress: 1006 on 5890  Progress: 1007 on 5890  Progress: 1008 on 5890  Progress: 1009 on 5890  Progress: 1010 on 5890  Progress: 1011 on 5890  Progress: 1012 on 5890  Progress: 1013 on 5890  Progress: 1014 on 5890  Progress: 1015 on 5890  Progress: 1016 on 5890  Progress: 1017 on 5890  Progress: 1018 on 5890  Progress: 1019 on 5890  Progress: 1020 on 5890  Progress: 1021 on 5890  Progress: 1022 on 5890  Progress: 1023 on 5890  Progress: 1024 on 5890  Progress: 1025 on 5890  Progress: 1026 on 5890  Progress: 1027 on 5890  Progress: 1028 on 5890  Progress: 1029 on 5890  Progress: 1030 on 5890  Progress: 1031 on 5890  Progress: 1032 on 5890  Progress: 1033 on 5890  Progress: 1034 on 5890  Progress: 1035 on 5890  Progress: 1036 on 5890  Progress: 1037 on 5890  Progress: 1038 on 5890  Progress: 1039 on 5890  Progress: 1040 on 5890  Progress: 1041 on 5890  Progress: 1042 on 5890  Progress: 1043 on 5890  Progress: 1044 on 5890  Progress: 1045 on 5890  Progress: 1046 on 5890  Progress: 1047 on 5890  Progress: 1048 on 5890  Progress: 1049 on 5890  Progress: 1050 on 5890  Progress: 1051 on 5890  Progress: 1052 on 5890  Progress: 1053 on 5890  Progress: 1054 on 5890  Progress: 1055 on 5890  Progress: 1056 on 5890  Progress: 1057 on 5890  Progress: 1058 on 5890  Progress: 1059 on 5890  Progress: 1060 on 5890  Progress: 1061 on 5890  Progress: 1062 on 5890  Progress: 1063 on 5890  Progress: 1064 on 5890  Progress: 1065 on 5890  Progress: 1066 on 5890  Progress: 1067 on 5890  Progress: 1068 on 5890  Progress: 1069 on 5890  Progress: 1070 on 5890  Progress: 1071 on 5890  Progress: 1072 on 5890  Progress: 1073 on 5890  Progress: 1074 on 5890  Progress: 1075 on 5890  Progress: 1076 on 5890  Progress: 1077 on 5890  Progress: 1078 on 5890  Progress: 1079 on 5890  Progress: 1080 on 5890  Progress: 1081 on 5890  Progress: 1082 on 5890  Progress: 1083 on 5890  Progress: 1084 on 5890  Progress: 1085 on 5890  Progress: 1086 on 5890  Progress: 1087 on 5890  Progress: 1088 on 5890  Progress: 1089 on 5890  Progress: 1090 on 5890  Progress: 1091 on 5890  Progress: 1092 on 5890  Progress: 1093 on 5890  Progress: 1094 on 5890  Progress: 1095 on 5890  Progress: 1096 on 5890  Progress: 1097 on 5890  Progress: 1098 on 5890  Progress: 1099 on 5890  Progress: 1100 on 5890  Progress: 1101 on 5890  Progress: 1102 on 5890  Progress: 1103 on 5890  Progress: 1104 on 5890  Progress: 1105 on 5890  Progress: 1106 on 5890  Progress: 1107 on 5890  Progress: 1108 on 5890  Progress: 1109 on 5890  Progress: 1110 on 5890  Progress: 1111 on 5890  Progress: 1112 on 5890  Progress: 1113 on 5890  Progress: 1114 on 5890  Progress: 1115 on 5890  Progress: 1116 on 5890  Progress: 1117 on 5890  Progress: 1118 on 5890  Progress: 1119 on 5890  Progress: 1120 on 5890  Progress: 1121 on 5890  Progress: 1122 on 5890  Progress: 1123 on 5890  Progress: 1124 on 5890  Progress: 1125 on 5890  Progress: 1126 on 5890  Progress: 1127 on 5890  Progress: 1128 on 5890  Progress: 1129 on 5890  Progress: 1130 on 5890  Progress: 1131 on 5890  Progress: 1132 on 5890  Progress: 1133 on 5890  Progress: 1134 on 5890  Progress: 1135 on 5890  Progress: 1136 on 5890  Progress: 1137 on 5890  Progress: 1138 on 5890  Progress: 1139 on 5890  Progress: 1140 on 5890  Progress: 1141 on 5890  Progress: 1142 on 5890  Progress: 1143 on 5890  Progress: 1144 on 5890  Progress: 1145 on 5890  Progress: 1146 on 5890  Progress: 1147 on 5890  Progress: 1148 on 5890  Progress: 1149 on 5890  Progress: 1150 on 5890  Progress: 1151 on 5890  Progress: 1152 on 5890  Progress: 1153 on 5890  Progress: 1154 on 5890  Progress: 1155 on 5890  Progress: 1156 on 5890  Progress: 1157 on 5890  Progress: 1158 on 5890  Progress: 1159 on 5890  Progress: 1160 on 5890  Progress: 1161 on 5890  Progress: 1162 on 5890  Progress: 1163 on 5890  Progress: 1164 on 5890  Progress: 1165 on 5890  Progress: 1166 on 5890  Progress: 1167 on 5890  Progress: 1168 on 5890  Progress: 1169 on 5890  Progress: 1170 on 5890  Progress: 1171 on 5890  Progress: 1172 on 5890  Progress: 1173 on 5890  Progress: 1174 on 5890  Progress: 1175 on 5890  Progress: 1176 on 5890  Progress: 1177 on 5890  Progress: 1178 on 5890  Progress: 1179 on 5890  Progress: 1180 on 5890  Progress: 1181 on 5890  Progress: 1182 on 5890  Progress: 1183 on 5890  Progress: 1184 on 5890  Progress: 1185 on 5890  Progress: 1186 on 5890  Progress: 1187 on 5890  Progress: 1188 on 5890  Progress: 1189 on 5890  Progress: 1190 on 5890  Progress: 1191 on 5890  Progress: 1192 on 5890  Progress: 1193 on 5890  Progress: 1194 on 5890  Progress: 1195 on 5890  Progress: 1196 on 5890  Progress: 1197 on 5890  Progress: 1198 on 5890  Progress: 1199 on 5890  Progress: 1200 on 5890  Progress: 1201 on 5890  Progress: 1202 on 5890  Progress: 1203 on 5890  Progress: 1204 on 5890  Progress: 1205 on 5890  Progress: 1206 on 5890  Progress: 1207 on 5890  Progress: 1208 on 5890  Progress: 1209 on 5890  Progress: 1210 on 5890  Progress: 1211 on 5890  Progress: 1212 on 5890  Progress: 1213 on 5890  Progress: 1214 on 5890  Progress: 1215 on 5890  Progress: 1216 on 5890  Progress: 1217 on 5890  Progress: 1218 on 5890  Progress: 1219 on 5890  Progress: 1220 on 5890  Progress: 1221 on 5890  Progress: 1222 on 5890  Progress: 1223 on 5890  Progress: 1224 on 5890  Progress: 1225 on 5890  Progress: 1226 on 5890  Progress: 1227 on 5890  Progress: 1228 on 5890  Progress: 1229 on 5890  Progress: 1230 on 5890  Progress: 1231 on 5890  Progress: 1232 on 5890  Progress: 1233 on 5890  Progress: 1234 on 5890  Progress: 1235 on 5890  Progress: 1236 on 5890  Progress: 1237 on 5890  Progress: 1238 on 5890  Progress: 1239 on 5890  Progress: 1240 on 5890  Progress: 1241 on 5890  Progress: 1242 on 5890  Progress: 1243 on 5890  Progress: 1244 on 5890  Progress: 1245 on 5890  Progress: 1246 on 5890  Progress: 1247 on 5890  Progress: 1248 on 5890  Progress: 1249 on 5890  Progress: 1250 on 5890  Progress: 1251 on 5890  Progress: 1252 on 5890  Progress: 1253 on 5890  Progress: 1254 on 5890  Progress: 1255 on 5890  Progress: 1256 on 5890  Progress: 1257 on 5890  Progress: 1258 on 5890  Progress: 1259 on 5890  Progress: 1260 on 5890  Progress: 1261 on 5890  Progress: 1262 on 5890  Progress: 1263 on 5890  Progress: 1264 on 5890  Progress: 1265 on 5890  Progress: 1266 on 5890  Progress: 1267 on 5890  Progress: 1268 on 5890  Progress: 1269 on 5890  Progress: 1270 on 5890  Progress: 1271 on 5890  Progress: 1272 on 5890  Progress: 1273 on 5890  Progress: 1274 on 5890  Progress: 1275 on 5890  Progress: 1276 on 5890  Progress: 1277 on 5890  Progress: 1278 on 5890  Progress: 1279 on 5890  Progress: 1280 on 5890  Progress: 1281 on 5890  Progress: 1282 on 5890  Progress: 1283 on 5890  Progress: 1284 on 5890  Progress: 1285 on 5890  Progress: 1286 on 5890  Progress: 1287 on 5890  Progress: 1288 on 5890  Progress: 1289 on 5890  Progress: 1290 on 5890  Progress: 1291 on 5890  Progress: 1292 on 5890  Progress: 1293 on 5890  Progress: 1294 on 5890  Progress: 1295 on 5890  Progress: 1296 on 5890  Progress: 1297 on 5890  Progress: 1298 on 5890  Progress: 1299 on 5890  Progress: 1300 on 5890  Progress: 1301 on 5890  Progress: 1302 on 5890  Progress: 1303 on 5890  Progress: 1304 on 5890  Progress: 1305 on 5890  Progress: 1306 on 5890  Progress: 1307 on 5890  Progress: 1308 on 5890  Progress: 1309 on 5890  Progress: 1310 on 5890  Progress: 1311 on 5890  Progress: 1312 on 5890  Progress: 1313 on 5890  Progress: 1314 on 5890  Progress: 1315 on 5890  Progress: 1316 on 5890  Progress: 1317 on 5890  Progress: 1318 on 5890  Progress: 1319 on 5890  Progress: 1320 on 5890  Progress: 1321 on 5890  Progress: 1322 on 5890  Progress: 1323 on 5890  Progress: 1324 on 5890  Progress: 1325 on 5890  Progress: 1326 on 5890  Progress: 1327 on 5890  Progress: 1328 on 5890  Progress: 1329 on 5890  Progress: 1330 on 5890  Progress: 1331 on 5890  Progress: 1332 on 5890  Progress: 1333 on 5890  Progress: 1334 on 5890  Progress: 1335 on 5890  Progress: 1336 on 5890  Progress: 1337 on 5890  Progress: 1338 on 5890  Progress: 1339 on 5890  Progress: 1340 on 5890  Progress: 1341 on 5890  Progress: 1342 on 5890  Progress: 1343 on 5890  Progress: 1344 on 5890  Progress: 1345 on 5890  Progress: 1346 on 5890  Progress: 1347 on 5890  Progress: 1348 on 5890  Progress: 1349 on 5890  Progress: 1350 on 5890  Progress: 1351 on 5890  Progress: 1352 on 5890  Progress: 1353 on 5890  Progress: 1354 on 5890  Progress: 1355 on 5890  Progress: 1356 on 5890  Progress: 1357 on 5890  Progress: 1358 on 5890  Progress: 1359 on 5890  Progress: 1360 on 5890  Progress: 1361 on 5890  Progress: 1362 on 5890  Progress: 1363 on 5890  Progress: 1364 on 5890  Progress: 1365 on 5890  Progress: 1366 on 5890  Progress: 1367 on 5890  Progress: 1368 on 5890  Progress: 1369 on 5890  Progress: 1370 on 5890  Progress: 1371 on 5890  Progress: 1372 on 5890  Progress: 1373 on 5890  Progress: 1374 on 5890  Progress: 1375 on 5890  Progress: 1376 on 5890  Progress: 1377 on 5890  Progress: 1378 on 5890  Progress: 1379 on 5890  Progress: 1380 on 5890  Progress: 1381 on 5890  Progress: 1382 on 5890  Progress: 1383 on 5890  Progress: 1384 on 5890  Progress: 1385 on 5890  Progress: 1386 on 5890  Progress: 1387 on 5890  Progress: 1388 on 5890  Progress: 1389 on 5890  Progress: 1390 on 5890  Progress: 1391 on 5890  Progress: 1392 on 5890  Progress: 1393 on 5890  Progress: 1394 on 5890  Progress: 1395 on 5890  Progress: 1396 on 5890  Progress: 1397 on 5890  Progress: 1398 on 5890  Progress: 1399 on 5890  Progress: 1400 on 5890  Progress: 1401 on 5890  Progress: 1402 on 5890  Progress: 1403 on 5890  Progress: 1404 on 5890  Progress: 1405 on 5890  Progress: 1406 on 5890  Progress: 1407 on 5890  Progress: 1408 on 5890  Progress: 1409 on 5890  Progress: 1410 on 5890  Progress: 1411 on 5890  Progress: 1412 on 5890  Progress: 1413 on 5890  Progress: 1414 on 5890  Progress: 1415 on 5890  Progress: 1416 on 5890  Progress: 1417 on 5890  Progress: 1418 on 5890  Progress: 1419 on 5890  Progress: 1420 on 5890  Progress: 1421 on 5890  Progress: 1422 on 5890  Progress: 1423 on 5890  Progress: 1424 on 5890  Progress: 1425 on 5890  Progress: 1426 on 5890  Progress: 1427 on 5890  Progress: 1428 on 5890  Progress: 1429 on 5890  Progress: 1430 on 5890  Progress: 1431 on 5890  Progress: 1432 on 5890  Progress: 1433 on 5890  Progress: 1434 on 5890  Progress: 1435 on 5890  Progress: 1436 on 5890  Progress: 1437 on 5890  Progress: 1438 on 5890  Progress: 1439 on 5890  Progress: 1440 on 5890  Progress: 1441 on 5890  Progress: 1442 on 5890  Progress: 1443 on 5890  Progress: 1444 on 5890  Progress: 1445 on 5890  Progress: 1446 on 5890  Progress: 1447 on 5890  Progress: 1448 on 5890  Progress: 1449 on 5890  Progress: 1450 on 5890  Progress: 1451 on 5890  Progress: 1452 on 5890  Progress: 1453 on 5890  Progress: 1454 on 5890  Progress: 1455 on 5890  Progress: 1456 on 5890  Progress: 1457 on 5890  Progress: 1458 on 5890  Progress: 1459 on 5890  Progress: 1460 on 5890  Progress: 1461 on 5890  Progress: 1462 on 5890  Progress: 1463 on 5890  Progress: 1464 on 5890  Progress: 1465 on 5890  Progress: 1466 on 5890  Progress: 1467 on 5890  Progress: 1468 on 5890  Progress: 1469 on 5890  Progress: 1470 on 5890  Progress: 1471 on 5890  Progress: 1472 on 5890  Progress: 1473 on 5890  Progress: 1474 on 5890  Progress: 1475 on 5890  Progress: 1476 on 5890  Progress: 1477 on 5890  Progress: 1478 on 5890  Progress: 1479 on 5890  Progress: 1480 on 5890  Progress: 1481 on 5890  Progress: 1482 on 5890  Progress: 1483 on 5890  Progress: 1484 on 5890  Progress: 1485 on 5890  Progress: 1486 on 5890  Progress: 1487 on 5890  Progress: 1488 on 5890  Progress: 1489 on 5890  Progress: 1490 on 5890  Progress: 1491 on 5890  Progress: 1492 on 5890  Progress: 1493 on 5890  Progress: 1494 on 5890  Progress: 1495 on 5890  Progress: 1496 on 5890  Progress: 1497 on 5890  Progress: 1498 on 5890  Progress: 1499 on 5890  Progress: 1500 on 5890  Progress: 1501 on 5890  Progress: 1502 on 5890  Progress: 1503 on 5890  Progress: 1504 on 5890  Progress: 1505 on 5890  Progress: 1506 on 5890  Progress: 1507 on 5890  Progress: 1508 on 5890  Progress: 1509 on 5890  Progress: 1510 on 5890  Progress: 1511 on 5890  Progress: 1512 on 5890  Progress: 1513 on 5890  Progress: 1514 on 5890  Progress: 1515 on 5890  Progress: 1516 on 5890  Progress: 1517 on 5890  Progress: 1518 on 5890  Progress: 1519 on 5890  Progress: 1520 on 5890  Progress: 1521 on 5890  Progress: 1522 on 5890  Progress: 1523 on 5890  Progress: 1524 on 5890  Progress: 1525 on 5890  Progress: 1526 on 5890  Progress: 1527 on 5890  Progress: 1528 on 5890  Progress: 1529 on 5890  Progress: 1530 on 5890  Progress: 1531 on 5890  Progress: 1532 on 5890  Progress: 1533 on 5890  Progress: 1534 on 5890  Progress: 1535 on 5890  Progress: 1536 on 5890  Progress: 1537 on 5890  Progress: 1538 on 5890  Progress: 1539 on 5890  Progress: 1540 on 5890  Progress: 1541 on 5890  Progress: 1542 on 5890  Progress: 1543 on 5890  Progress: 1544 on 5890  Progress: 1545 on 5890  Progress: 1546 on 5890  Progress: 1547 on 5890  Progress: 1548 on 5890  Progress: 1549 on 5890  Progress: 1550 on 5890  Progress: 1551 on 5890  Progress: 1552 on 5890  Progress: 1553 on 5890  Progress: 1554 on 5890  Progress: 1555 on 5890  Progress: 1556 on 5890  Progress: 1557 on 5890  Progress: 1558 on 5890  Progress: 1559 on 5890  Progress: 1560 on 5890  Progress: 1561 on 5890  Progress: 1562 on 5890  Progress: 1563 on 5890  Progress: 1564 on 5890  Progress: 1565 on 5890  Progress: 1566 on 5890  Progress: 1567 on 5890  Progress: 1568 on 5890  Progress: 1569 on 5890  Progress: 1570 on 5890  Progress: 1571 on 5890  Progress: 1572 on 5890  Progress: 1573 on 5890  Progress: 1574 on 5890  Progress: 1575 on 5890  Progress: 1576 on 5890  Progress: 1577 on 5890  Progress: 1578 on 5890  Progress: 1579 on 5890  Progress: 1580 on 5890  Progress: 1581 on 5890  Progress: 1582 on 5890  Progress: 1583 on 5890  Progress: 1584 on 5890  Progress: 1585 on 5890  Progress: 1586 on 5890  Progress: 1587 on 5890  Progress: 1588 on 5890  Progress: 1589 on 5890  Progress: 1590 on 5890  Progress: 1591 on 5890  Progress: 1592 on 5890  Progress: 1593 on 5890  Progress: 1594 on 5890  Progress: 1595 on 5890  Progress: 1596 on 5890  Progress: 1597 on 5890  Progress: 1598 on 5890  Progress: 1599 on 5890  Progress: 1600 on 5890  Progress: 1601 on 5890  Progress: 1602 on 5890  Progress: 1603 on 5890  Progress: 1604 on 5890  Progress: 1605 on 5890  Progress: 1606 on 5890  Progress: 1607 on 5890  Progress: 1608 on 5890  Progress: 1609 on 5890  Progress: 1610 on 5890  Progress: 1611 on 5890  Progress: 1612 on 5890  Progress: 1613 on 5890  Progress: 1614 on 5890  Progress: 1615 on 5890  Progress: 1616 on 5890  Progress: 1617 on 5890  Progress: 1618 on 5890  Progress: 1619 on 5890  Progress: 1620 on 5890  Progress: 1621 on 5890  Progress: 1622 on 5890  Progress: 1623 on 5890  Progress: 1624 on 5890  Progress: 1625 on 5890  Progress: 1626 on 5890  Progress: 1627 on 5890  Progress: 1628 on 5890  Progress: 1629 on 5890  Progress: 1630 on 5890  Progress: 1631 on 5890  Progress: 1632 on 5890  Progress: 1633 on 5890  Progress: 1634 on 5890  Progress: 1635 on 5890  Progress: 1636 on 5890  Progress: 1637 on 5890  Progress: 1638 on 5890  Progress: 1639 on 5890  Progress: 1640 on 5890  Progress: 1641 on 5890  Progress: 1642 on 5890  Progress: 1643 on 5890  Progress: 1644 on 5890  Progress: 1645 on 5890  Progress: 1646 on 5890  Progress: 1647 on 5890  Progress: 1648 on 5890  Progress: 1649 on 5890  Progress: 1650 on 5890  Progress: 1651 on 5890  Progress: 1652 on 5890  Progress: 1653 on 5890  Progress: 1654 on 5890  Progress: 1655 on 5890  Progress: 1656 on 5890  Progress: 1657 on 5890  Progress: 1658 on 5890  Progress: 1659 on 5890  Progress: 1660 on 5890  Progress: 1661 on 5890  Progress: 1662 on 5890  Progress: 1663 on 5890  Progress: 1664 on 5890  Progress: 1665 on 5890  Progress: 1666 on 5890  Progress: 1667 on 5890  Progress: 1668 on 5890  Progress: 1669 on 5890  Progress: 1670 on 5890  Progress: 1671 on 5890  Progress: 1672 on 5890  Progress: 1673 on 5890  Progress: 1674 on 5890  Progress: 1675 on 5890  Progress: 1676 on 5890  Progress: 1677 on 5890  Progress: 1678 on 5890  Progress: 1679 on 5890  Progress: 1680 on 5890  Progress: 1681 on 5890  Progress: 1682 on 5890  Progress: 1683 on 5890  Progress: 1684 on 5890  Progress: 1685 on 5890  Progress: 1686 on 5890  Progress: 1687 on 5890  Progress: 1688 on 5890  Progress: 1689 on 5890  Progress: 1690 on 5890  Progress: 1691 on 5890  Progress: 1692 on 5890  Progress: 1693 on 5890  Progress: 1694 on 5890  Progress: 1695 on 5890  Progress: 1696 on 5890  Progress: 1697 on 5890  Progress: 1698 on 5890  Progress: 1699 on 5890  Progress: 1700 on 5890  Progress: 1701 on 5890  Progress: 1702 on 5890  Progress: 1703 on 5890  Progress: 1704 on 5890  Progress: 1705 on 5890  Progress: 1706 on 5890  Progress: 1707 on 5890  Progress: 1708 on 5890  Progress: 1709 on 5890  Progress: 1710 on 5890  Progress: 1711 on 5890  Progress: 1712 on 5890  Progress: 1713 on 5890  Progress: 1714 on 5890  Progress: 1715 on 5890  Progress: 1716 on 5890  Progress: 1717 on 5890  Progress: 1718 on 5890  Progress: 1719 on 5890  Progress: 1720 on 5890  Progress: 1721 on 5890  Progress: 1722 on 5890  Progress: 1723 on 5890  Progress: 1724 on 5890  Progress: 1725 on 5890  Progress: 1726 on 5890  Progress: 1727 on 5890  Progress: 1728 on 5890  Progress: 1729 on 5890  Progress: 1730 on 5890  Progress: 1731 on 5890  Progress: 1732 on 5890  Progress: 1733 on 5890  Progress: 1734 on 5890  Progress: 1735 on 5890  Progress: 1736 on 5890  Progress: 1737 on 5890  Progress: 1738 on 5890  Progress: 1739 on 5890  Progress: 1740 on 5890  Progress: 1741 on 5890  Progress: 1742 on 5890  Progress: 1743 on 5890  Progress: 1744 on 5890  Progress: 1745 on 5890  Progress: 1746 on 5890  Progress: 1747 on 5890  Progress: 1748 on 5890  Progress: 1749 on 5890  Progress: 1750 on 5890  Progress: 1751 on 5890  Progress: 1752 on 5890  Progress: 1753 on 5890  Progress: 1754 on 5890  Progress: 1755 on 5890  Progress: 1756 on 5890  Progress: 1757 on 5890  Progress: 1758 on 5890  Progress: 1759 on 5890  Progress: 1760 on 5890  Progress: 1761 on 5890  Progress: 1762 on 5890  Progress: 1763 on 5890  Progress: 1764 on 5890  Progress: 1765 on 5890  Progress: 1766 on 5890  Progress: 1767 on 5890  Progress: 1768 on 5890  Progress: 1769 on 5890  Progress: 1770 on 5890  Progress: 1771 on 5890  Progress: 1772 on 5890  Progress: 1773 on 5890  Progress: 1774 on 5890  Progress: 1775 on 5890  Progress: 1776 on 5890  Progress: 1777 on 5890  Progress: 1778 on 5890  Progress: 1779 on 5890  Progress: 1780 on 5890  Progress: 1781 on 5890  Progress: 1782 on 5890  Progress: 1783 on 5890  Progress: 1784 on 5890  Progress: 1785 on 5890  Progress: 1786 on 5890  Progress: 1787 on 5890  Progress: 1788 on 5890  Progress: 1789 on 5890  Progress: 1790 on 5890  Progress: 1791 on 5890  Progress: 1792 on 5890  Progress: 1793 on 5890  Progress: 1794 on 5890  Progress: 1795 on 5890  Progress: 1796 on 5890  Progress: 1797 on 5890  Progress: 1798 on 5890  Progress: 1799 on 5890  Progress: 1800 on 5890  Progress: 1801 on 5890  Progress: 1802 on 5890  Progress: 1803 on 5890  Progress: 1804 on 5890  Progress: 1805 on 5890  Progress: 1806 on 5890  Progress: 1807 on 5890  Progress: 1808 on 5890  Progress: 1809 on 5890  Progress: 1810 on 5890  Progress: 1811 on 5890  Progress: 1812 on 5890  Progress: 1813 on 5890  Progress: 1814 on 5890  Progress: 1815 on 5890  Progress: 1816 on 5890  Progress: 1817 on 5890  Progress: 1818 on 5890  Progress: 1819 on 5890  Progress: 1820 on 5890  Progress: 1821 on 5890  Progress: 1822 on 5890  Progress: 1823 on 5890  Progress: 1824 on 5890  Progress: 1825 on 5890  Progress: 1826 on 5890  Progress: 1827 on 5890  Progress: 1828 on 5890  Progress: 1829 on 5890  Progress: 1830 on 5890  Progress: 1831 on 5890  Progress: 1832 on 5890  Progress: 1833 on 5890  Progress: 1834 on 5890  Progress: 1835 on 5890  Progress: 1836 on 5890  Progress: 1837 on 5890  Progress: 1838 on 5890  Progress: 1839 on 5890  Progress: 1840 on 5890  Progress: 1841 on 5890  Progress: 1842 on 5890  Progress: 1843 on 5890  Progress: 1844 on 5890  Progress: 1845 on 5890  Progress: 1846 on 5890  Progress: 1847 on 5890  Progress: 1848 on 5890  Progress: 1849 on 5890  Progress: 1850 on 5890  Progress: 1851 on 5890  Progress: 1852 on 5890  Progress: 1853 on 5890  Progress: 1854 on 5890  Progress: 1855 on 5890  Progress: 1856 on 5890  Progress: 1857 on 5890  Progress: 1858 on 5890  Progress: 1859 on 5890  Progress: 1860 on 5890  Progress: 1861 on 5890  Progress: 1862 on 5890  Progress: 1863 on 5890  Progress: 1864 on 5890  Progress: 1865 on 5890  Progress: 1866 on 5890  Progress: 1867 on 5890  Progress: 1868 on 5890  Progress: 1869 on 5890  Progress: 1870 on 5890  Progress: 1871 on 5890  Progress: 1872 on 5890  Progress: 1873 on 5890  Progress: 1874 on 5890  Progress: 1875 on 5890  Progress: 1876 on 5890  Progress: 1877 on 5890  Progress: 1878 on 5890  Progress: 1879 on 5890  Progress: 1880 on 5890  Progress: 1881 on 5890  Progress: 1882 on 5890  Progress: 1883 on 5890  Progress: 1884 on 5890  Progress: 1885 on 5890  Progress: 1886 on 5890  Progress: 1887 on 5890  Progress: 1888 on 5890  Progress: 1889 on 5890  Progress: 1890 on 5890  Progress: 1891 on 5890  Progress: 1892 on 5890  Progress: 1893 on 5890  Progress: 1894 on 5890  Progress: 1895 on 5890  Progress: 1896 on 5890  Progress: 1897 on 5890  Progress: 1898 on 5890  Progress: 1899 on 5890  Progress: 1900 on 5890  Progress: 1901 on 5890  Progress: 1902 on 5890  Progress: 1903 on 5890  Progress: 1904 on 5890  Progress: 1905 on 5890  Progress: 1906 on 5890  Progress: 1907 on 5890  Progress: 1908 on 5890  Progress: 1909 on 5890  Progress: 1910 on 5890  Progress: 1911 on 5890  Progress: 1912 on 5890  Progress: 1913 on 5890  Progress: 1914 on 5890  Progress: 1915 on 5890  Progress: 1916 on 5890  Progress: 1917 on 5890  Progress: 1918 on 5890  Progress: 1919 on 5890  Progress: 1920 on 5890  Progress: 1921 on 5890  Progress: 1922 on 5890  Progress: 1923 on 5890  Progress: 1924 on 5890  Progress: 1925 on 5890  Progress: 1926 on 5890  Progress: 1927 on 5890  Progress: 1928 on 5890  Progress: 1929 on 5890  Progress: 1930 on 5890  Progress: 1931 on 5890  Progress: 1932 on 5890  Progress: 1933 on 5890  Progress: 1934 on 5890  Progress: 1935 on 5890  Progress: 1936 on 5890  Progress: 1937 on 5890  Progress: 1938 on 5890  Progress: 1939 on 5890  Progress: 1940 on 5890  Progress: 1941 on 5890  Progress: 1942 on 5890  Progress: 1943 on 5890  Progress: 1944 on 5890  Progress: 1945 on 5890  Progress: 1946 on 5890  Progress: 1947 on 5890  Progress: 1948 on 5890  Progress: 1949 on 5890  Progress: 1950 on 5890  Progress: 1951 on 5890  Progress: 1952 on 5890  Progress: 1953 on 5890  Progress: 1954 on 5890  Progress: 1955 on 5890  Progress: 1956 on 5890  Progress: 1957 on 5890  Progress: 1958 on 5890  Progress: 1959 on 5890  Progress: 1960 on 5890  Progress: 1961 on 5890  Progress: 1962 on 5890  Progress: 1963 on 5890  Progress: 1964 on 5890  Progress: 1965 on 5890  Progress: 1966 on 5890  Progress: 1967 on 5890  Progress: 1968 on 5890  Progress: 1969 on 5890  Progress: 1970 on 5890  Progress: 1971 on 5890  Progress: 1972 on 5890  Progress: 1973 on 5890  Progress: 1974 on 5890  Progress: 1975 on 5890  Progress: 1976 on 5890  Progress: 1977 on 5890  Progress: 1978 on 5890  Progress: 1979 on 5890  Progress: 1980 on 5890  Progress: 1981 on 5890  Progress: 1982 on 5890  Progress: 1983 on 5890  Progress: 1984 on 5890  Progress: 1985 on 5890  Progress: 1986 on 5890  Progress: 1987 on 5890  Progress: 1988 on 5890  Progress: 1989 on 5890  Progress: 1990 on 5890  Progress: 1991 on 5890  Progress: 1992 on 5890  Progress: 1993 on 5890  Progress: 1994 on 5890  Progress: 1995 on 5890  Progress: 1996 on 5890  Progress: 1997 on 5890  Progress: 1998 on 5890  Progress: 1999 on 5890  Progress: 2000 on 5890  Progress: 2001 on 5890  Progress: 2002 on 5890  Progress: 2003 on 5890  Progress: 2004 on 5890  Progress: 2005 on 5890  Progress: 2006 on 5890  Progress: 2007 on 5890  Progress: 2008 on 5890  Progress: 2009 on 5890  Progress: 2010 on 5890  Progress: 2011 on 5890  Progress: 2012 on 5890  Progress: 2013 on 5890  Progress: 2014 on 5890  Progress: 2015 on 5890  Progress: 2016 on 5890  Progress: 2017 on 5890  Progress: 2018 on 5890  Progress: 2019 on 5890  Progress: 2020 on 5890  Progress: 2021 on 5890  Progress: 2022 on 5890  Progress: 2023 on 5890  Progress: 2024 on 5890  Progress: 2025 on 5890  Progress: 2026 on 5890  Progress: 2027 on 5890  Progress: 2028 on 5890  Progress: 2029 on 5890  Progress: 2030 on 5890  Progress: 2031 on 5890  Progress: 2032 on 5890  Progress: 2033 on 5890  Progress: 2034 on 5890  Progress: 2035 on 5890  Progress: 2036 on 5890  Progress: 2037 on 5890  Progress: 2038 on 5890  Progress: 2039 on 5890  Progress: 2040 on 5890  Progress: 2041 on 5890  Progress: 2042 on 5890  Progress: 2043 on 5890  Progress: 2044 on 5890  Progress: 2045 on 5890  Progress: 2046 on 5890  Progress: 2047 on 5890  Progress: 2048 on 5890  Progress: 2049 on 5890  Progress: 2050 on 5890  Progress: 2051 on 5890  Progress: 2052 on 5890  Progress: 2053 on 5890  Progress: 2054 on 5890  Progress: 2055 on 5890  Progress: 2056 on 5890  Progress: 2057 on 5890  Progress: 2058 on 5890  Progress: 2059 on 5890  Progress: 2060 on 5890  Progress: 2061 on 5890  Progress: 2062 on 5890  Progress: 2063 on 5890  Progress: 2064 on 5890  Progress: 2065 on 5890  Progress: 2066 on 5890  Progress: 2067 on 5890  Progress: 2068 on 5890  Progress: 2069 on 5890  Progress: 2070 on 5890  Progress: 2071 on 5890  Progress: 2072 on 5890  Progress: 2073 on 5890  Progress: 2074 on 5890  Progress: 2075 on 5890  Progress: 2076 on 5890  Progress: 2077 on 5890  Progress: 2078 on 5890  Progress: 2079 on 5890  Progress: 2080 on 5890  Progress: 2081 on 5890  Progress: 2082 on 5890  Progress: 2083 on 5890  Progress: 2084 on 5890  Progress: 2085 on 5890  Progress: 2086 on 5890  Progress: 2087 on 5890  Progress: 2088 on 5890  Progress: 2089 on 5890  Progress: 2090 on 5890  Progress: 2091 on 5890  Progress: 2092 on 5890  Progress: 2093 on 5890  Progress: 2094 on 5890  Progress: 2095 on 5890  Progress: 2096 on 5890  Progress: 2097 on 5890  Progress: 2098 on 5890  Progress: 2099 on 5890  Progress: 2100 on 5890  Progress: 2101 on 5890  Progress: 2102 on 5890  Progress: 2103 on 5890  Progress: 2104 on 5890  Progress: 2105 on 5890  Progress: 2106 on 5890  Progress: 2107 on 5890  Progress: 2108 on 5890  Progress: 2109 on 5890  Progress: 2110 on 5890  Progress: 2111 on 5890  Progress: 2112 on 5890  Progress: 2113 on 5890  Progress: 2114 on 5890  Progress: 2115 on 5890  Progress: 2116 on 5890  Progress: 2117 on 5890  Progress: 2118 on 5890  Progress: 2119 on 5890  Progress: 2120 on 5890  Progress: 2121 on 5890  Progress: 2122 on 5890  Progress: 2123 on 5890  Progress: 2124 on 5890  Progress: 2125 on 5890  Progress: 2126 on 5890  Progress: 2127 on 5890  Progress: 2128 on 5890  Progress: 2129 on 5890  Progress: 2130 on 5890  Progress: 2131 on 5890  Progress: 2132 on 5890  Progress: 2133 on 5890  Progress: 2134 on 5890  Progress: 2135 on 5890  Progress: 2136 on 5890  Progress: 2137 on 5890  Progress: 2138 on 5890  Progress: 2139 on 5890  Progress: 2140 on 5890  Progress: 2141 on 5890  Progress: 2142 on 5890  Progress: 2143 on 5890  Progress: 2144 on 5890  Progress: 2145 on 5890  Progress: 2146 on 5890  Progress: 2147 on 5890  Progress: 2148 on 5890  Progress: 2149 on 5890  Progress: 2150 on 5890  Progress: 2151 on 5890  Progress: 2152 on 5890  Progress: 2153 on 5890  Progress: 2154 on 5890  Progress: 2155 on 5890  Progress: 2156 on 5890  Progress: 2157 on 5890  Progress: 2158 on 5890  Progress: 2159 on 5890  Progress: 2160 on 5890  Progress: 2161 on 5890  Progress: 2162 on 5890  Progress: 2163 on 5890  Progress: 2164 on 5890  Progress: 2165 on 5890  Progress: 2166 on 5890  Progress: 2167 on 5890  Progress: 2168 on 5890  Progress: 2169 on 5890  Progress: 2170 on 5890  Progress: 2171 on 5890  Progress: 2172 on 5890  Progress: 2173 on 5890  Progress: 2174 on 5890  Progress: 2175 on 5890  Progress: 2176 on 5890  Progress: 2177 on 5890  Progress: 2178 on 5890  Progress: 2179 on 5890  Progress: 2180 on 5890  Progress: 2181 on 5890  Progress: 2182 on 5890  Progress: 2183 on 5890  Progress: 2184 on 5890  Progress: 2185 on 5890  Progress: 2186 on 5890  Progress: 2187 on 5890  Progress: 2188 on 5890  Progress: 2189 on 5890  Progress: 2190 on 5890  Progress: 2191 on 5890  Progress: 2192 on 5890  Progress: 2193 on 5890  Progress: 2194 on 5890  Progress: 2195 on 5890  Progress: 2196 on 5890  Progress: 2197 on 5890  Progress: 2198 on 5890  Progress: 2199 on 5890  Progress: 2200 on 5890  Progress: 2201 on 5890  Progress: 2202 on 5890  Progress: 2203 on 5890  Progress: 2204 on 5890  Progress: 2205 on 5890  Progress: 2206 on 5890  Progress: 2207 on 5890  Progress: 2208 on 5890  Progress: 2209 on 5890  Progress: 2210 on 5890  Progress: 2211 on 5890  Progress: 2212 on 5890  Progress: 2213 on 5890  Progress: 2214 on 5890  Progress: 2215 on 5890  Progress: 2216 on 5890  Progress: 2217 on 5890  Progress: 2218 on 5890  Progress: 2219 on 5890  Progress: 2220 on 5890  Progress: 2221 on 5890  Progress: 2222 on 5890  Progress: 2223 on 5890  Progress: 2224 on 5890  Progress: 2225 on 5890  Progress: 2226 on 5890  Progress: 2227 on 5890  Progress: 2228 on 5890  Progress: 2229 on 5890  Progress: 2230 on 5890  Progress: 2231 on 5890  Progress: 2232 on 5890  Progress: 2233 on 5890  Progress: 2234 on 5890  Progress: 2235 on 5890  Progress: 2236 on 5890  Progress: 2237 on 5890  Progress: 2238 on 5890  Progress: 2239 on 5890  Progress: 2240 on 5890  Progress: 2241 on 5890  Progress: 2242 on 5890  Progress: 2243 on 5890  Progress: 2244 on 5890  Progress: 2245 on 5890  Progress: 2246 on 5890  Progress: 2247 on 5890  Progress: 2248 on 5890  Progress: 2249 on 5890  Progress: 2250 on 5890  Progress: 2251 on 5890  Progress: 2252 on 5890  Progress: 2253 on 5890  Progress: 2254 on 5890  Progress: 2255 on 5890  Progress: 2256 on 5890  Progress: 2257 on 5890  Progress: 2258 on 5890  Progress: 2259 on 5890  Progress: 2260 on 5890  Progress: 2261 on 5890  Progress: 2262 on 5890  Progress: 2263 on 5890  Progress: 2264 on 5890  Progress: 2265 on 5890  Progress: 2266 on 5890  Progress: 2267 on 5890  Progress: 2268 on 5890  Progress: 2269 on 5890  Progress: 2270 on 5890  Progress: 2271 on 5890  Progress: 2272 on 5890  Progress: 2273 on 5890  Progress: 2274 on 5890  Progress: 2275 on 5890  Progress: 2276 on 5890  Progress: 2277 on 5890  Progress: 2278 on 5890  Progress: 2279 on 5890  Progress: 2280 on 5890  Progress: 2281 on 5890  Progress: 2282 on 5890  Progress: 2283 on 5890  Progress: 2284 on 5890  Progress: 2285 on 5890  Progress: 2286 on 5890  Progress: 2287 on 5890  Progress: 2288 on 5890  Progress: 2289 on 5890  Progress: 2290 on 5890  Progress: 2291 on 5890  Progress: 2292 on 5890  Progress: 2293 on 5890  Progress: 2294 on 5890  Progress: 2295 on 5890  Progress: 2296 on 5890  Progress: 2297 on 5890  Progress: 2298 on 5890  Progress: 2299 on 5890  Progress: 2300 on 5890  Progress: 2301 on 5890  Progress: 2302 on 5890  Progress: 2303 on 5890  Progress: 2304 on 5890  Progress: 2305 on 5890  Progress: 2306 on 5890  Progress: 2307 on 5890  Progress: 2308 on 5890  Progress: 2309 on 5890  Progress: 2310 on 5890  Progress: 2311 on 5890  Progress: 2312 on 5890  Progress: 2313 on 5890  Progress: 2314 on 5890  Progress: 2315 on 5890  Progress: 2316 on 5890  Progress: 2317 on 5890  Progress: 2318 on 5890  Progress: 2319 on 5890  Progress: 2320 on 5890  Progress: 2321 on 5890  Progress: 2322 on 5890  Progress: 2323 on 5890  Progress: 2324 on 5890  Progress: 2325 on 5890  Progress: 2326 on 5890  Progress: 2327 on 5890  Progress: 2328 on 5890  Progress: 2329 on 5890  Progress: 2330 on 5890  Progress: 2331 on 5890  Progress: 2332 on 5890  Progress: 2333 on 5890  Progress: 2334 on 5890  Progress: 2335 on 5890  Progress: 2336 on 5890  Progress: 2337 on 5890  Progress: 2338 on 5890  Progress: 2339 on 5890  Progress: 2340 on 5890  Progress: 2341 on 5890  Progress: 2342 on 5890  Progress: 2343 on 5890  Progress: 2344 on 5890  Progress: 2345 on 5890  Progress: 2346 on 5890  Progress: 2347 on 5890  Progress: 2348 on 5890  Progress: 2349 on 5890  Progress: 2350 on 5890  Progress: 2351 on 5890  Progress: 2352 on 5890  Progress: 2353 on 5890  Progress: 2354 on 5890  Progress: 2355 on 5890  Progress: 2356 on 5890  Progress: 2357 on 5890  Progress: 2358 on 5890  Progress: 2359 on 5890  Progress: 2360 on 5890  Progress: 2361 on 5890  Progress: 2362 on 5890  Progress: 2363 on 5890  Progress: 2364 on 5890  Progress: 2365 on 5890  Progress: 2366 on 5890  Progress: 2367 on 5890  Progress: 2368 on 5890  Progress: 2369 on 5890  Progress: 2370 on 5890  Progress: 2371 on 5890  Progress: 2372 on 5890  Progress: 2373 on 5890  Progress: 2374 on 5890  Progress: 2375 on 5890  Progress: 2376 on 5890  Progress: 2377 on 5890  Progress: 2378 on 5890  Progress: 2379 on 5890  Progress: 2380 on 5890  Progress: 2381 on 5890  Progress: 2382 on 5890  Progress: 2383 on 5890  Progress: 2384 on 5890  Progress: 2385 on 5890  Progress: 2386 on 5890  Progress: 2387 on 5890  Progress: 2388 on 5890  Progress: 2389 on 5890  Progress: 2390 on 5890  Progress: 2391 on 5890  Progress: 2392 on 5890  Progress: 2393 on 5890  Progress: 2394 on 5890  Progress: 2395 on 5890  Progress: 2396 on 5890  Progress: 2397 on 5890  Progress: 2398 on 5890  Progress: 2399 on 5890  Progress: 2400 on 5890  Progress: 2401 on 5890  Progress: 2402 on 5890  Progress: 2403 on 5890  Progress: 2404 on 5890  Progress: 2405 on 5890  Progress: 2406 on 5890  Progress: 2407 on 5890  Progress: 2408 on 5890  Progress: 2409 on 5890  Progress: 2410 on 5890  Progress: 2411 on 5890  Progress: 2412 on 5890  Progress: 2413 on 5890  Progress: 2414 on 5890  Progress: 2415 on 5890  Progress: 2416 on 5890  Progress: 2417 on 5890  Progress: 2418 on 5890  Progress: 2419 on 5890  Progress: 2420 on 5890  Progress: 2421 on 5890  Progress: 2422 on 5890  Progress: 2423 on 5890  Progress: 2424 on 5890  Progress: 2425 on 5890  Progress: 2426 on 5890  Progress: 2427 on 5890  Progress: 2428 on 5890  Progress: 2429 on 5890  Progress: 2430 on 5890  Progress: 2431 on 5890  Progress: 2432 on 5890  Progress: 2433 on 5890  Progress: 2434 on 5890  Progress: 2435 on 5890  Progress: 2436 on 5890  Progress: 2437 on 5890  Progress: 2438 on 5890  Progress: 2439 on 5890  Progress: 2440 on 5890  Progress: 2441 on 5890  Progress: 2442 on 5890  Progress: 2443 on 5890  Progress: 2444 on 5890  Progress: 2445 on 5890  Progress: 2446 on 5890  Progress: 2447 on 5890  Progress: 2448 on 5890  Progress: 2449 on 5890  Progress: 2450 on 5890  Progress: 2451 on 5890  Progress: 2452 on 5890  Progress: 2453 on 5890  Progress: 2454 on 5890  Progress: 2455 on 5890  Progress: 2456 on 5890  Progress: 2457 on 5890  Progress: 2458 on 5890  Progress: 2459 on 5890  Progress: 2460 on 5890  Progress: 2461 on 5890  Progress: 2462 on 5890  Progress: 2463 on 5890  Progress: 2464 on 5890  Progress: 2465 on 5890  Progress: 2466 on 5890  Progress: 2467 on 5890  Progress: 2468 on 5890  Progress: 2469 on 5890  Progress: 2470 on 5890  Progress: 2471 on 5890  Progress: 2472 on 5890  Progress: 2473 on 5890  Progress: 2474 on 5890  Progress: 2475 on 5890  Progress: 2476 on 5890  Progress: 2477 on 5890  Progress: 2478 on 5890  Progress: 2479 on 5890  Progress: 2480 on 5890  Progress: 2481 on 5890  Progress: 2482 on 5890  Progress: 2483 on 5890  Progress: 2484 on 5890  Progress: 2485 on 5890  Progress: 2486 on 5890  Progress: 2487 on 5890  Progress: 2488 on 5890  Progress: 2489 on 5890  Progress: 2490 on 5890  Progress: 2491 on 5890  Progress: 2492 on 5890  Progress: 2493 on 5890  Progress: 2494 on 5890  Progress: 2495 on 5890  Progress: 2496 on 5890  Progress: 2497 on 5890  Progress: 2498 on 5890  Progress: 2499 on 5890  Progress: 2500 on 5890  Progress: 2501 on 5890  Progress: 2502 on 5890  Progress: 2503 on 5890  Progress: 2504 on 5890  Progress: 2505 on 5890  Progress: 2506 on 5890  Progress: 2507 on 5890  Progress: 2508 on 5890  Progress: 2509 on 5890  Progress: 2510 on 5890  Progress: 2511 on 5890  Progress: 2512 on 5890  Progress: 2513 on 5890  Progress: 2514 on 5890  Progress: 2515 on 5890  Progress: 2516 on 5890  Progress: 2517 on 5890  Progress: 2518 on 5890  Progress: 2519 on 5890  Progress: 2520 on 5890  Progress: 2521 on 5890  Progress: 2522 on 5890  Progress: 2523 on 5890  Progress: 2524 on 5890  Progress: 2525 on 5890  Progress: 2526 on 5890  Progress: 2527 on 5890  Progress: 2528 on 5890  Progress: 2529 on 5890  Progress: 2530 on 5890  Progress: 2531 on 5890  Progress: 2532 on 5890  Progress: 2533 on 5890  Progress: 2534 on 5890  Progress: 2535 on 5890  Progress: 2536 on 5890  Progress: 2537 on 5890  Progress: 2538 on 5890  Progress: 2539 on 5890  Progress: 2540 on 5890  Progress: 2541 on 5890  Progress: 2542 on 5890  Progress: 2543 on 5890  Progress: 2544 on 5890  Progress: 2545 on 5890  Progress: 2546 on 5890  Progress: 2547 on 5890  Progress: 2548 on 5890  Progress: 2549 on 5890  Progress: 2550 on 5890  Progress: 2551 on 5890  Progress: 2552 on 5890  Progress: 2553 on 5890  Progress: 2554 on 5890  Progress: 2555 on 5890  Progress: 2556 on 5890  Progress: 2557 on 5890  Progress: 2558 on 5890  Progress: 2559 on 5890  Progress: 2560 on 5890  Progress: 2561 on 5890  Progress: 2562 on 5890  Progress: 2563 on 5890  Progress: 2564 on 5890  Progress: 2565 on 5890  Progress: 2566 on 5890  Progress: 2567 on 5890  Progress: 2568 on 5890  Progress: 2569 on 5890  Progress: 2570 on 5890  Progress: 2571 on 5890  Progress: 2572 on 5890  Progress: 2573 on 5890  Progress: 2574 on 5890  Progress: 2575 on 5890  Progress: 2576 on 5890  Progress: 2577 on 5890  Progress: 2578 on 5890  Progress: 2579 on 5890  Progress: 2580 on 5890  Progress: 2581 on 5890  Progress: 2582 on 5890  Progress: 2583 on 5890  Progress: 2584 on 5890  Progress: 2585 on 5890  Progress: 2586 on 5890  Progress: 2587 on 5890  Progress: 2588 on 5890  Progress: 2589 on 5890  Progress: 2590 on 5890  Progress: 2591 on 5890  Progress: 2592 on 5890  Progress: 2593 on 5890  Progress: 2594 on 5890  Progress: 2595 on 5890  Progress: 2596 on 5890  Progress: 2597 on 5890  Progress: 2598 on 5890  Progress: 2599 on 5890  Progress: 2600 on 5890  Progress: 2601 on 5890  Progress: 2602 on 5890  Progress: 2603 on 5890  Progress: 2604 on 5890  Progress: 2605 on 5890  Progress: 2606 on 5890  Progress: 2607 on 5890  Progress: 2608 on 5890  Progress: 2609 on 5890  Progress: 2610 on 5890  Progress: 2611 on 5890  Progress: 2612 on 5890  Progress: 2613 on 5890  Progress: 2614 on 5890  Progress: 2615 on 5890  Progress: 2616 on 5890  Progress: 2617 on 5890  Progress: 2618 on 5890  Progress: 2619 on 5890  Progress: 2620 on 5890  Progress: 2621 on 5890  Progress: 2622 on 5890  Progress: 2623 on 5890  Progress: 2624 on 5890  Progress: 2625 on 5890  Progress: 2626 on 5890  Progress: 2627 on 5890  Progress: 2628 on 5890  Progress: 2629 on 5890  Progress: 2630 on 5890  Progress: 2631 on 5890  Progress: 2632 on 5890  Progress: 2633 on 5890  Progress: 2634 on 5890  Progress: 2635 on 5890  Progress: 2636 on 5890  Progress: 2637 on 5890  Progress: 2638 on 5890  Progress: 2639 on 5890  Progress: 2640 on 5890  Progress: 2641 on 5890  Progress: 2642 on 5890  Progress: 2643 on 5890  Progress: 2644 on 5890  Progress: 2645 on 5890  Progress: 2646 on 5890  Progress: 2647 on 5890  Progress: 2648 on 5890  Progress: 2649 on 5890  Progress: 2650 on 5890  Progress: 2651 on 5890  Progress: 2652 on 5890  Progress: 2653 on 5890  Progress: 2654 on 5890  Progress: 2655 on 5890  Progress: 2656 on 5890  Progress: 2657 on 5890  Progress: 2658 on 5890  Progress: 2659 on 5890  Progress: 2660 on 5890  Progress: 2661 on 5890  Progress: 2662 on 5890  Progress: 2663 on 5890  Progress: 2664 on 5890  Progress: 2665 on 5890  Progress: 2666 on 5890  Progress: 2667 on 5890  Progress: 2668 on 5890  Progress: 2669 on 5890  Progress: 2670 on 5890  Progress: 2671 on 5890  Progress: 2672 on 5890  Progress: 2673 on 5890  Progress: 2674 on 5890  Progress: 2675 on 5890  Progress: 2676 on 5890  Progress: 2677 on 5890  Progress: 2678 on 5890  Progress: 2679 on 5890  Progress: 2680 on 5890  Progress: 2681 on 5890  Progress: 2682 on 5890  Progress: 2683 on 5890  Progress: 2684 on 5890  Progress: 2685 on 5890  Progress: 2686 on 5890  Progress: 2687 on 5890  Progress: 2688 on 5890  Progress: 2689 on 5890  Progress: 2690 on 5890  Progress: 2691 on 5890  Progress: 2692 on 5890  Progress: 2693 on 5890  Progress: 2694 on 5890  Progress: 2695 on 5890  Progress: 2696 on 5890  Progress: 2697 on 5890  Progress: 2698 on 5890  Progress: 2699 on 5890  Progress: 2700 on 5890  Progress: 2701 on 5890  Progress: 2702 on 5890  Progress: 2703 on 5890  Progress: 2704 on 5890  Progress: 2705 on 5890  Progress: 2706 on 5890  Progress: 2707 on 5890  Progress: 2708 on 5890  Progress: 2709 on 5890  Progress: 2710 on 5890  Progress: 2711 on 5890  Progress: 2712 on 5890  Progress: 2713 on 5890  Progress: 2714 on 5890  Progress: 2715 on 5890  Progress: 2716 on 5890  Progress: 2717 on 5890  Progress: 2718 on 5890  Progress: 2719 on 5890  Progress: 2720 on 5890  Progress: 2721 on 5890  Progress: 2722 on 5890  Progress: 2723 on 5890  Progress: 2724 on 5890  Progress: 2725 on 5890  Progress: 2726 on 5890  Progress: 2727 on 5890  Progress: 2728 on 5890  Progress: 2729 on 5890  Progress: 2730 on 5890  Progress: 2731 on 5890  Progress: 2732 on 5890  Progress: 2733 on 5890  Progress: 2734 on 5890  Progress: 2735 on 5890  Progress: 2736 on 5890  Progress: 2737 on 5890  Progress: 2738 on 5890  Progress: 2739 on 5890  Progress: 2740 on 5890  Progress: 2741 on 5890  Progress: 2742 on 5890  Progress: 2743 on 5890  Progress: 2744 on 5890  Progress: 2745 on 5890  Progress: 2746 on 5890  Progress: 2747 on 5890  Progress: 2748 on 5890  Progress: 2749 on 5890  Progress: 2750 on 5890  Progress: 2751 on 5890  Progress: 2752 on 5890  Progress: 2753 on 5890  Progress: 2754 on 5890  Progress: 2755 on 5890  Progress: 2756 on 5890  Progress: 2757 on 5890  Progress: 2758 on 5890  Progress: 2759 on 5890  Progress: 2760 on 5890  Progress: 2761 on 5890  Progress: 2762 on 5890  Progress: 2763 on 5890  Progress: 2764 on 5890  Progress: 2765 on 5890  Progress: 2766 on 5890  Progress: 2767 on 5890  Progress: 2768 on 5890  Progress: 2769 on 5890  Progress: 2770 on 5890  Progress: 2771 on 5890  Progress: 2772 on 5890  Progress: 2773 on 5890  Progress: 2774 on 5890  Progress: 2775 on 5890  Progress: 2776 on 5890  Progress: 2777 on 5890  Progress: 2778 on 5890  Progress: 2779 on 5890  Progress: 2780 on 5890  Progress: 2781 on 5890  Progress: 2782 on 5890  Progress: 2783 on 5890  Progress: 2784 on 5890  Progress: 2785 on 5890  Progress: 2786 on 5890  Progress: 2787 on 5890  Progress: 2788 on 5890  Progress: 2789 on 5890  Progress: 2790 on 5890  Progress: 2791 on 5890  Progress: 2792 on 5890  Progress: 2793 on 5890  Progress: 2794 on 5890  Progress: 2795 on 5890  Progress: 2796 on 5890  Progress: 2797 on 5890  Progress: 2798 on 5890  Progress: 2799 on 5890  Progress: 2800 on 5890  Progress: 2801 on 5890  Progress: 2802 on 5890  Progress: 2803 on 5890  Progress: 2804 on 5890  Progress: 2805 on 5890  Progress: 2806 on 5890  Progress: 2807 on 5890  Progress: 2808 on 5890  Progress: 2809 on 5890  Progress: 2810 on 5890  Progress: 2811 on 5890  Progress: 2812 on 5890  Progress: 2813 on 5890  Progress: 2814 on 5890  Progress: 2815 on 5890  Progress: 2816 on 5890  Progress: 2817 on 5890  Progress: 2818 on 5890  Progress: 2819 on 5890  Progress: 2820 on 5890  Progress: 2821 on 5890  Progress: 2822 on 5890  Progress: 2823 on 5890  Progress: 2824 on 5890  Progress: 2825 on 5890  Progress: 2826 on 5890  Progress: 2827 on 5890  Progress: 2828 on 5890  Progress: 2829 on 5890  Progress: 2830 on 5890  Progress: 2831 on 5890  Progress: 2832 on 5890  Progress: 2833 on 5890  Progress: 2834 on 5890  Progress: 2835 on 5890  Progress: 2836 on 5890  Progress: 2837 on 5890  Progress: 2838 on 5890  Progress: 2839 on 5890  Progress: 2840 on 5890  Progress: 2841 on 5890  Progress: 2842 on 5890  Progress: 2843 on 5890  Progress: 2844 on 5890  Progress: 2845 on 5890  Progress: 2846 on 5890  Progress: 2847 on 5890  Progress: 2848 on 5890  Progress: 2849 on 5890  Progress: 2850 on 5890  Progress: 2851 on 5890  Progress: 2852 on 5890  Progress: 2853 on 5890  Progress: 2854 on 5890  Progress: 2855 on 5890  Progress: 2856 on 5890  Progress: 2857 on 5890  Progress: 2858 on 5890  Progress: 2859 on 5890  Progress: 2860 on 5890  Progress: 2861 on 5890  Progress: 2862 on 5890  Progress: 2863 on 5890  Progress: 2864 on 5890  Progress: 2865 on 5890  Progress: 2866 on 5890  Progress: 2867 on 5890  Progress: 2868 on 5890  Progress: 2869 on 5890  Progress: 2870 on 5890  Progress: 2871 on 5890  Progress: 2872 on 5890  Progress: 2873 on 5890  Progress: 2874 on 5890  Progress: 2875 on 5890  Progress: 2876 on 5890  Progress: 2877 on 5890  Progress: 2878 on 5890  Progress: 2879 on 5890  Progress: 2880 on 5890  Progress: 2881 on 5890  Progress: 2882 on 5890  Progress: 2883 on 5890  Progress: 2884 on 5890  Progress: 2885 on 5890  Progress: 2886 on 5890  Progress: 2887 on 5890  Progress: 2888 on 5890  Progress: 2889 on 5890  Progress: 2890 on 5890  Progress: 2891 on 5890  Progress: 2892 on 5890  Progress: 2893 on 5890  Progress: 2894 on 5890  Progress: 2895 on 5890  Progress: 2896 on 5890  Progress: 2897 on 5890  Progress: 2898 on 5890  Progress: 2899 on 5890  Progress: 2900 on 5890  Progress: 2901 on 5890  Progress: 2902 on 5890  Progress: 2903 on 5890  Progress: 2904 on 5890  Progress: 2905 on 5890  Progress: 2906 on 5890  Progress: 2907 on 5890  Progress: 2908 on 5890  Progress: 2909 on 5890  Progress: 2910 on 5890  Progress: 2911 on 5890  Progress: 2912 on 5890  Progress: 2913 on 5890  Progress: 2914 on 5890  Progress: 2915 on 5890  Progress: 2916 on 5890  Progress: 2917 on 5890  Progress: 2918 on 5890  Progress: 2919 on 5890  Progress: 2920 on 5890  Progress: 2921 on 5890  Progress: 2922 on 5890  Progress: 2923 on 5890  Progress: 2924 on 5890  Progress: 2925 on 5890  Progress: 2926 on 5890  Progress: 2927 on 5890  Progress: 2928 on 5890  Progress: 2929 on 5890  Progress: 2930 on 5890  Progress: 2931 on 5890  Progress: 2932 on 5890  Progress: 2933 on 5890  Progress: 2934 on 5890  Progress: 2935 on 5890  Progress: 2936 on 5890  Progress: 2937 on 5890  Progress: 2938 on 5890  Progress: 2939 on 5890  Progress: 2940 on 5890  Progress: 2941 on 5890  Progress: 2942 on 5890  Progress: 2943 on 5890  Progress: 2944 on 5890  Progress: 2945 on 5890  Progress: 2946 on 5890  Progress: 2947 on 5890  Progress: 2948 on 5890  Progress: 2949 on 5890  Progress: 2950 on 5890  Progress: 2951 on 5890  Progress: 2952 on 5890  Progress: 2953 on 5890  Progress: 2954 on 5890  Progress: 2955 on 5890  Progress: 2956 on 5890  Progress: 2957 on 5890  Progress: 2958 on 5890  Progress: 2959 on 5890  Progress: 2960 on 5890  Progress: 2961 on 5890  Progress: 2962 on 5890  Progress: 2963 on 5890  Progress: 2964 on 5890  Progress: 2965 on 5890  Progress: 2966 on 5890  Progress: 2967 on 5890  Progress: 2968 on 5890  Progress: 2969 on 5890  Progress: 2970 on 5890  Progress: 2971 on 5890  Progress: 2972 on 5890  Progress: 2973 on 5890  Progress: 2974 on 5890  Progress: 2975 on 5890  Progress: 2976 on 5890  Progress: 2977 on 5890  Progress: 2978 on 5890  Progress: 2979 on 5890  Progress: 2980 on 5890  Progress: 2981 on 5890  Progress: 2982 on 5890  Progress: 2983 on 5890  Progress: 2984 on 5890  Progress: 2985 on 5890  Progress: 2986 on 5890  Progress: 2987 on 5890  Progress: 2988 on 5890  Progress: 2989 on 5890  Progress: 2990 on 5890  Progress: 2991 on 5890  Progress: 2992 on 5890  Progress: 2993 on 5890  Progress: 2994 on 5890  Progress: 2995 on 5890  Progress: 2996 on 5890  Progress: 2997 on 5890  Progress: 2998 on 5890  Progress: 2999 on 5890  Progress: 3000 on 5890  Progress: 3001 on 5890  Progress: 3002 on 5890  Progress: 3003 on 5890  Progress: 3004 on 5890  Progress: 3005 on 5890  Progress: 3006 on 5890  Progress: 3007 on 5890  Progress: 3008 on 5890  Progress: 3009 on 5890  Progress: 3010 on 5890  Progress: 3011 on 5890  Progress: 3012 on 5890  Progress: 3013 on 5890  Progress: 3014 on 5890  Progress: 3015 on 5890  Progress: 3016 on 5890  Progress: 3017 on 5890  Progress: 3018 on 5890  Progress: 3019 on 5890  Progress: 3020 on 5890  Progress: 3021 on 5890  Progress: 3022 on 5890  Progress: 3023 on 5890  Progress: 3024 on 5890  Progress: 3025 on 5890  Progress: 3026 on 5890  Progress: 3027 on 5890  Progress: 3028 on 5890  Progress: 3029 on 5890  Progress: 3030 on 5890  Progress: 3031 on 5890  Progress: 3032 on 5890  Progress: 3033 on 5890  Progress: 3034 on 5890  Progress: 3035 on 5890  Progress: 3036 on 5890  Progress: 3037 on 5890  Progress: 3038 on 5890  Progress: 3039 on 5890  Progress: 3040 on 5890  Progress: 3041 on 5890  Progress: 3042 on 5890  Progress: 3043 on 5890  Progress: 3044 on 5890  Progress: 3045 on 5890  Progress: 3046 on 5890  Progress: 3047 on 5890  Progress: 3048 on 5890  Progress: 3049 on 5890  Progress: 3050 on 5890  Progress: 3051 on 5890  Progress: 3052 on 5890  Progress: 3053 on 5890  Progress: 3054 on 5890  Progress: 3055 on 5890  Progress: 3056 on 5890  Progress: 3057 on 5890  Progress: 3058 on 5890  Progress: 3059 on 5890  Progress: 3060 on 5890  Progress: 3061 on 5890  Progress: 3062 on 5890  Progress: 3063 on 5890  Progress: 3064 on 5890  Progress: 3065 on 5890  Progress: 3066 on 5890  Progress: 3067 on 5890  Progress: 3068 on 5890  Progress: 3069 on 5890  Progress: 3070 on 5890  Progress: 3071 on 5890  Progress: 3072 on 5890  Progress: 3073 on 5890  Progress: 3074 on 5890  Progress: 3075 on 5890  Progress: 3076 on 5890  Progress: 3077 on 5890  Progress: 3078 on 5890  Progress: 3079 on 5890  Progress: 3080 on 5890  Progress: 3081 on 5890  Progress: 3082 on 5890  Progress: 3083 on 5890  Progress: 3084 on 5890  Progress: 3085 on 5890  Progress: 3086 on 5890  Progress: 3087 on 5890  Progress: 3088 on 5890  Progress: 3089 on 5890  Progress: 3090 on 5890  Progress: 3091 on 5890  Progress: 3092 on 5890  Progress: 3093 on 5890  Progress: 3094 on 5890  Progress: 3095 on 5890  Progress: 3096 on 5890  Progress: 3097 on 5890  Progress: 3098 on 5890  Progress: 3099 on 5890  Progress: 3100 on 5890  Progress: 3101 on 5890  Progress: 3102 on 5890  Progress: 3103 on 5890  Progress: 3104 on 5890  Progress: 3105 on 5890  Progress: 3106 on 5890  Progress: 3107 on 5890  Progress: 3108 on 5890  Progress: 3109 on 5890  Progress: 3110 on 5890  Progress: 3111 on 5890  Progress: 3112 on 5890  Progress: 3113 on 5890  Progress: 3114 on 5890  Progress: 3115 on 5890  Progress: 3116 on 5890  Progress: 3117 on 5890  Progress: 3118 on 5890  Progress: 3119 on 5890  Progress: 3120 on 5890  Progress: 3121 on 5890  Progress: 3122 on 5890  Progress: 3123 on 5890  Progress: 3124 on 5890  Progress: 3125 on 5890  Progress: 3126 on 5890  Progress: 3127 on 5890  Progress: 3128 on 5890  Progress: 3129 on 5890  Progress: 3130 on 5890  Progress: 3131 on 5890  Progress: 3132 on 5890  Progress: 3133 on 5890  Progress: 3134 on 5890  Progress: 3135 on 5890  Progress: 3136 on 5890  Progress: 3137 on 5890  Progress: 3138 on 5890  Progress: 3139 on 5890  Progress: 3140 on 5890  Progress: 3141 on 5890  Progress: 3142 on 5890  Progress: 3143 on 5890  Progress: 3144 on 5890  Progress: 3145 on 5890  Progress: 3146 on 5890  Progress: 3147 on 5890  Progress: 3148 on 5890  Progress: 3149 on 5890  Progress: 3150 on 5890  Progress: 3151 on 5890  Progress: 3152 on 5890  Progress: 3153 on 5890  Progress: 3154 on 5890  Progress: 3155 on 5890  Progress: 3156 on 5890  Progress: 3157 on 5890  Progress: 3158 on 5890  Progress: 3159 on 5890  Progress: 3160 on 5890  Progress: 3161 on 5890  Progress: 3162 on 5890  Progress: 3163 on 5890  Progress: 3164 on 5890  Progress: 3165 on 5890  Progress: 3166 on 5890  Progress: 3167 on 5890  Progress: 3168 on 5890  Progress: 3169 on 5890  Progress: 3170 on 5890  Progress: 3171 on 5890  Progress: 3172 on 5890  Progress: 3173 on 5890  Progress: 3174 on 5890  Progress: 3175 on 5890  Progress: 3176 on 5890  Progress: 3177 on 5890  Progress: 3178 on 5890  Progress: 3179 on 5890  Progress: 3180 on 5890  Progress: 3181 on 5890  Progress: 3182 on 5890  Progress: 3183 on 5890  Progress: 3184 on 5890  Progress: 3185 on 5890  Progress: 3186 on 5890  Progress: 3187 on 5890  Progress: 3188 on 5890  Progress: 3189 on 5890  Progress: 3190 on 5890  Progress: 3191 on 5890  Progress: 3192 on 5890  Progress: 3193 on 5890  Progress: 3194 on 5890  Progress: 3195 on 5890  Progress: 3196 on 5890  Progress: 3197 on 5890  Progress: 3198 on 5890  Progress: 3199 on 5890  Progress: 3200 on 5890  Progress: 3201 on 5890  Progress: 3202 on 5890  Progress: 3203 on 5890  Progress: 3204 on 5890  Progress: 3205 on 5890  Progress: 3206 on 5890  Progress: 3207 on 5890  Progress: 3208 on 5890  Progress: 3209 on 5890  Progress: 3210 on 5890  Progress: 3211 on 5890  Progress: 3212 on 5890  Progress: 3213 on 5890  Progress: 3214 on 5890  Progress: 3215 on 5890  Progress: 3216 on 5890  Progress: 3217 on 5890  Progress: 3218 on 5890  Progress: 3219 on 5890  Progress: 3220 on 5890  Progress: 3221 on 5890  Progress: 3222 on 5890  Progress: 3223 on 5890  Progress: 3224 on 5890  Progress: 3225 on 5890  Progress: 3226 on 5890  Progress: 3227 on 5890  Progress: 3228 on 5890  Progress: 3229 on 5890  Progress: 3230 on 5890  Progress: 3231 on 5890  Progress: 3232 on 5890  Progress: 3233 on 5890  Progress: 3234 on 5890  Progress: 3235 on 5890  Progress: 3236 on 5890  Progress: 3237 on 5890  Progress: 3238 on 5890  Progress: 3239 on 5890  Progress: 3240 on 5890  Progress: 3241 on 5890  Progress: 3242 on 5890  Progress: 3243 on 5890  Progress: 3244 on 5890  Progress: 3245 on 5890  Progress: 3246 on 5890  Progress: 3247 on 5890  Progress: 3248 on 5890  Progress: 3249 on 5890  Progress: 3250 on 5890  Progress: 3251 on 5890  Progress: 3252 on 5890  Progress: 3253 on 5890  Progress: 3254 on 5890  Progress: 3255 on 5890  Progress: 3256 on 5890  Progress: 3257 on 5890  Progress: 3258 on 5890  Progress: 3259 on 5890  Progress: 3260 on 5890  Progress: 3261 on 5890  Progress: 3262 on 5890  Progress: 3263 on 5890  Progress: 3264 on 5890  Progress: 3265 on 5890  Progress: 3266 on 5890  Progress: 3267 on 5890  Progress: 3268 on 5890  Progress: 3269 on 5890  Progress: 3270 on 5890  Progress: 3271 on 5890  Progress: 3272 on 5890  Progress: 3273 on 5890  Progress: 3274 on 5890  Progress: 3275 on 5890  Progress: 3276 on 5890  Progress: 3277 on 5890  Progress: 3278 on 5890  Progress: 3279 on 5890  Progress: 3280 on 5890  Progress: 3281 on 5890  Progress: 3282 on 5890  Progress: 3283 on 5890  Progress: 3284 on 5890  Progress: 3285 on 5890  Progress: 3286 on 5890  Progress: 3287 on 5890  Progress: 3288 on 5890  Progress: 3289 on 5890  Progress: 3290 on 5890  Progress: 3291 on 5890  Progress: 3292 on 5890  Progress: 3293 on 5890  Progress: 3294 on 5890  Progress: 3295 on 5890  Progress: 3296 on 5890  Progress: 3297 on 5890  Progress: 3298 on 5890  Progress: 3299 on 5890  Progress: 3300 on 5890  Progress: 3301 on 5890  Progress: 3302 on 5890  Progress: 3303 on 5890  Progress: 3304 on 5890  Progress: 3305 on 5890  Progress: 3306 on 5890  Progress: 3307 on 5890  Progress: 3308 on 5890  Progress: 3309 on 5890  Progress: 3310 on 5890  Progress: 3311 on 5890  Progress: 3312 on 5890  Progress: 3313 on 5890  Progress: 3314 on 5890  Progress: 3315 on 5890  Progress: 3316 on 5890  Progress: 3317 on 5890  Progress: 3318 on 5890  Progress: 3319 on 5890  Progress: 3320 on 5890  Progress: 3321 on 5890  Progress: 3322 on 5890  Progress: 3323 on 5890  Progress: 3324 on 5890  Progress: 3325 on 5890  Progress: 3326 on 5890  Progress: 3327 on 5890  Progress: 3328 on 5890  Progress: 3329 on 5890  Progress: 3330 on 5890  Progress: 3331 on 5890  Progress: 3332 on 5890  Progress: 3333 on 5890  Progress: 3334 on 5890  Progress: 3335 on 5890  Progress: 3336 on 5890  Progress: 3337 on 5890  Progress: 3338 on 5890  Progress: 3339 on 5890  Progress: 3340 on 5890  Progress: 3341 on 5890  Progress: 3342 on 5890  Progress: 3343 on 5890  Progress: 3344 on 5890  Progress: 3345 on 5890  Progress: 3346 on 5890  Progress: 3347 on 5890  Progress: 3348 on 5890  Progress: 3349 on 5890  Progress: 3350 on 5890  Progress: 3351 on 5890  Progress: 3352 on 5890  Progress: 3353 on 5890  Progress: 3354 on 5890  Progress: 3355 on 5890  Progress: 3356 on 5890  Progress: 3357 on 5890  Progress: 3358 on 5890  Progress: 3359 on 5890  Progress: 3360 on 5890  Progress: 3361 on 5890  Progress: 3362 on 5890  Progress: 3363 on 5890  Progress: 3364 on 5890  Progress: 3365 on 5890  Progress: 3366 on 5890  Progress: 3367 on 5890  Progress: 3368 on 5890  Progress: 3369 on 5890  Progress: 3370 on 5890  Progress: 3371 on 5890  Progress: 3372 on 5890  Progress: 3373 on 5890  Progress: 3374 on 5890  Progress: 3375 on 5890  Progress: 3376 on 5890  Progress: 3377 on 5890  Progress: 3378 on 5890  Progress: 3379 on 5890  Progress: 3380 on 5890  Progress: 3381 on 5890  Progress: 3382 on 5890  Progress: 3383 on 5890  Progress: 3384 on 5890  Progress: 3385 on 5890  Progress: 3386 on 5890  Progress: 3387 on 5890  Progress: 3388 on 5890  Progress: 3389 on 5890  Progress: 3390 on 5890  Progress: 3391 on 5890  Progress: 3392 on 5890  Progress: 3393 on 5890  Progress: 3394 on 5890  Progress: 3395 on 5890  Progress: 3396 on 5890  Progress: 3397 on 5890  Progress: 3398 on 5890  Progress: 3399 on 5890  Progress: 3400 on 5890  Progress: 3401 on 5890  Progress: 3402 on 5890  Progress: 3403 on 5890  Progress: 3404 on 5890  Progress: 3405 on 5890  Progress: 3406 on 5890  Progress: 3407 on 5890  Progress: 3408 on 5890  Progress: 3409 on 5890  Progress: 3410 on 5890  Progress: 3411 on 5890  Progress: 3412 on 5890  Progress: 3413 on 5890  Progress: 3414 on 5890  Progress: 3415 on 5890  Progress: 3416 on 5890  Progress: 3417 on 5890  Progress: 3418 on 5890  Progress: 3419 on 5890  Progress: 3420 on 5890  Progress: 3421 on 5890  Progress: 3422 on 5890  Progress: 3423 on 5890  Progress: 3424 on 5890  Progress: 3425 on 5890  Progress: 3426 on 5890  Progress: 3427 on 5890  Progress: 3428 on 5890  Progress: 3429 on 5890  Progress: 3430 on 5890  Progress: 3431 on 5890  Progress: 3432 on 5890  Progress: 3433 on 5890  Progress: 3434 on 5890  Progress: 3435 on 5890  Progress: 3436 on 5890  Progress: 3437 on 5890  Progress: 3438 on 5890  Progress: 3439 on 5890  Progress: 3440 on 5890  Progress: 3441 on 5890  Progress: 3442 on 5890  Progress: 3443 on 5890  Progress: 3444 on 5890  Progress: 3445 on 5890  Progress: 3446 on 5890  Progress: 3447 on 5890  Progress: 3448 on 5890  Progress: 3449 on 5890  Progress: 3450 on 5890  Progress: 3451 on 5890  Progress: 3452 on 5890  Progress: 3453 on 5890  Progress: 3454 on 5890  Progress: 3455 on 5890  Progress: 3456 on 5890  Progress: 3457 on 5890  Progress: 3458 on 5890  Progress: 3459 on 5890  Progress: 3460 on 5890  Progress: 3461 on 5890  Progress: 3462 on 5890  Progress: 3463 on 5890  Progress: 3464 on 5890  Progress: 3465 on 5890  Progress: 3466 on 5890  Progress: 3467 on 5890  Progress: 3468 on 5890  Progress: 3469 on 5890  Progress: 3470 on 5890  Progress: 3471 on 5890  Progress: 3472 on 5890  Progress: 3473 on 5890  Progress: 3474 on 5890  Progress: 3475 on 5890  Progress: 3476 on 5890  Progress: 3477 on 5890  Progress: 3478 on 5890  Progress: 3479 on 5890  Progress: 3480 on 5890  Progress: 3481 on 5890  Progress: 3482 on 5890  Progress: 3483 on 5890  Progress: 3484 on 5890  Progress: 3485 on 5890  Progress: 3486 on 5890  Progress: 3487 on 5890  Progress: 3488 on 5890  Progress: 3489 on 5890  Progress: 3490 on 5890  Progress: 3491 on 5890  Progress: 3492 on 5890  Progress: 3493 on 5890  Progress: 3494 on 5890  Progress: 3495 on 5890  Progress: 3496 on 5890  Progress: 3497 on 5890  Progress: 3498 on 5890  Progress: 3499 on 5890  Progress: 3500 on 5890  Progress: 3501 on 5890  Progress: 3502 on 5890  Progress: 3503 on 5890  Progress: 3504 on 5890  Progress: 3505 on 5890  Progress: 3506 on 5890  Progress: 3507 on 5890  Progress: 3508 on 5890  Progress: 3509 on 5890  Progress: 3510 on 5890  Progress: 3511 on 5890  Progress: 3512 on 5890  Progress: 3513 on 5890  Progress: 3514 on 5890  Progress: 3515 on 5890  Progress: 3516 on 5890  Progress: 3517 on 5890  Progress: 3518 on 5890  Progress: 3519 on 5890  Progress: 3520 on 5890  Progress: 3521 on 5890  Progress: 3522 on 5890  Progress: 3523 on 5890  Progress: 3524 on 5890  Progress: 3525 on 5890  Progress: 3526 on 5890  Progress: 3527 on 5890  Progress: 3528 on 5890  Progress: 3529 on 5890  Progress: 3530 on 5890  Progress: 3531 on 5890  Progress: 3532 on 5890  Progress: 3533 on 5890  Progress: 3534 on 5890  Progress: 3535 on 5890  Progress: 3536 on 5890  Progress: 3537 on 5890  Progress: 3538 on 5890  Progress: 3539 on 5890  Progress: 3540 on 5890  Progress: 3541 on 5890  Progress: 3542 on 5890  Progress: 3543 on 5890  Progress: 3544 on 5890  Progress: 3545 on 5890  Progress: 3546 on 5890  Progress: 3547 on 5890  Progress: 3548 on 5890  Progress: 3549 on 5890  Progress: 3550 on 5890  Progress: 3551 on 5890  Progress: 3552 on 5890  Progress: 3553 on 5890  Progress: 3554 on 5890  Progress: 3555 on 5890  Progress: 3556 on 5890  Progress: 3557 on 5890  Progress: 3558 on 5890  Progress: 3559 on 5890  Progress: 3560 on 5890  Progress: 3561 on 5890  Progress: 3562 on 5890  Progress: 3563 on 5890  Progress: 3564 on 5890  Progress: 3565 on 5890  Progress: 3566 on 5890  Progress: 3567 on 5890  Progress: 3568 on 5890  Progress: 3569 on 5890  Progress: 3570 on 5890  Progress: 3571 on 5890  Progress: 3572 on 5890  Progress: 3573 on 5890  Progress: 3574 on 5890  Progress: 3575 on 5890  Progress: 3576 on 5890  Progress: 3577 on 5890  Progress: 3578 on 5890  Progress: 3579 on 5890  Progress: 3580 on 5890  Progress: 3581 on 5890  Progress: 3582 on 5890  Progress: 3583 on 5890  Progress: 3584 on 5890  Progress: 3585 on 5890  Progress: 3586 on 5890  Progress: 3587 on 5890  Progress: 3588 on 5890  Progress: 3589 on 5890  Progress: 3590 on 5890  Progress: 3591 on 5890  Progress: 3592 on 5890  Progress: 3593 on 5890  Progress: 3594 on 5890  Progress: 3595 on 5890  Progress: 3596 on 5890  Progress: 3597 on 5890  Progress: 3598 on 5890  Progress: 3599 on 5890  Progress: 3600 on 5890  Progress: 3601 on 5890  Progress: 3602 on 5890  Progress: 3603 on 5890  Progress: 3604 on 5890  Progress: 3605 on 5890  Progress: 3606 on 5890  Progress: 3607 on 5890  Progress: 3608 on 5890  Progress: 3609 on 5890  Progress: 3610 on 5890  Progress: 3611 on 5890  Progress: 3612 on 5890  Progress: 3613 on 5890  Progress: 3614 on 5890  Progress: 3615 on 5890  Progress: 3616 on 5890  Progress: 3617 on 5890  Progress: 3618 on 5890  Progress: 3619 on 5890  Progress: 3620 on 5890  Progress: 3621 on 5890  Progress: 3622 on 5890  Progress: 3623 on 5890  Progress: 3624 on 5890  Progress: 3625 on 5890  Progress: 3626 on 5890  Progress: 3627 on 5890  Progress: 3628 on 5890  Progress: 3629 on 5890  Progress: 3630 on 5890  Progress: 3631 on 5890  Progress: 3632 on 5890  Progress: 3633 on 5890  Progress: 3634 on 5890  Progress: 3635 on 5890  Progress: 3636 on 5890  Progress: 3637 on 5890  Progress: 3638 on 5890  Progress: 3639 on 5890  Progress: 3640 on 5890  Progress: 3641 on 5890  Progress: 3642 on 5890  Progress: 3643 on 5890  Progress: 3644 on 5890  Progress: 3645 on 5890  Progress: 3646 on 5890  Progress: 3647 on 5890  Progress: 3648 on 5890  Progress: 3649 on 5890  Progress: 3650 on 5890  Progress: 3651 on 5890  Progress: 3652 on 5890  Progress: 3653 on 5890  Progress: 3654 on 5890  Progress: 3655 on 5890  Progress: 3656 on 5890  Progress: 3657 on 5890  Progress: 3658 on 5890  Progress: 3659 on 5890  Progress: 3660 on 5890  Progress: 3661 on 5890  Progress: 3662 on 5890  Progress: 3663 on 5890  Progress: 3664 on 5890  Progress: 3665 on 5890  Progress: 3666 on 5890  Progress: 3667 on 5890  Progress: 3668 on 5890  Progress: 3669 on 5890  Progress: 3670 on 5890  Progress: 3671 on 5890  Progress: 3672 on 5890  Progress: 3673 on 5890  Progress: 3674 on 5890  Progress: 3675 on 5890  Progress: 3676 on 5890  Progress: 3677 on 5890  Progress: 3678 on 5890  Progress: 3679 on 5890  Progress: 3680 on 5890  Progress: 3681 on 5890  Progress: 3682 on 5890  Progress: 3683 on 5890  Progress: 3684 on 5890  Progress: 3685 on 5890  Progress: 3686 on 5890  Progress: 3687 on 5890  Progress: 3688 on 5890  Progress: 3689 on 5890  Progress: 3690 on 5890  Progress: 3691 on 5890  Progress: 3692 on 5890  Progress: 3693 on 5890  Progress: 3694 on 5890  Progress: 3695 on 5890  Progress: 3696 on 5890  Progress: 3697 on 5890  Progress: 3698 on 5890  Progress: 3699 on 5890  Progress: 3700 on 5890  Progress: 3701 on 5890  Progress: 3702 on 5890  Progress: 3703 on 5890  Progress: 3704 on 5890  Progress: 3705 on 5890  Progress: 3706 on 5890  Progress: 3707 on 5890  Progress: 3708 on 5890  Progress: 3709 on 5890  Progress: 3710 on 5890  Progress: 3711 on 5890  Progress: 3712 on 5890  Progress: 3713 on 5890  Progress: 3714 on 5890  Progress: 3715 on 5890  Progress: 3716 on 5890  Progress: 3717 on 5890  Progress: 3718 on 5890  Progress: 3719 on 5890  Progress: 3720 on 5890  Progress: 3721 on 5890  Progress: 3722 on 5890  Progress: 3723 on 5890  Progress: 3724 on 5890  Progress: 3725 on 5890  Progress: 3726 on 5890  Progress: 3727 on 5890  Progress: 3728 on 5890  Progress: 3729 on 5890  Progress: 3730 on 5890  Progress: 3731 on 5890  Progress: 3732 on 5890  Progress: 3733 on 5890  Progress: 3734 on 5890  Progress: 3735 on 5890  Progress: 3736 on 5890  Progress: 3737 on 5890  Progress: 3738 on 5890  Progress: 3739 on 5890  Progress: 3740 on 5890  Progress: 3741 on 5890  Progress: 3742 on 5890  Progress: 3743 on 5890  Progress: 3744 on 5890  Progress: 3745 on 5890  Progress: 3746 on 5890  Progress: 3747 on 5890  Progress: 3748 on 5890  Progress: 3749 on 5890  Progress: 3750 on 5890  Progress: 3751 on 5890  Progress: 3752 on 5890  Progress: 3753 on 5890  Progress: 3754 on 5890  Progress: 3755 on 5890  Progress: 3756 on 5890  Progress: 3757 on 5890  Progress: 3758 on 5890  Progress: 3759 on 5890  Progress: 3760 on 5890  Progress: 3761 on 5890  Progress: 3762 on 5890  Progress: 3763 on 5890  Progress: 3764 on 5890  Progress: 3765 on 5890  Progress: 3766 on 5890  Progress: 3767 on 5890  Progress: 3768 on 5890  Progress: 3769 on 5890  Progress: 3770 on 5890  Progress: 3771 on 5890  Progress: 3772 on 5890  Progress: 3773 on 5890  Progress: 3774 on 5890  Progress: 3775 on 5890  Progress: 3776 on 5890  Progress: 3777 on 5890  Progress: 3778 on 5890  Progress: 3779 on 5890  Progress: 3780 on 5890  Progress: 3781 on 5890  Progress: 3782 on 5890  Progress: 3783 on 5890  Progress: 3784 on 5890  Progress: 3785 on 5890  Progress: 3786 on 5890  Progress: 3787 on 5890  Progress: 3788 on 5890  Progress: 3789 on 5890  Progress: 3790 on 5890  Progress: 3791 on 5890  Progress: 3792 on 5890  Progress: 3793 on 5890  Progress: 3794 on 5890  Progress: 3795 on 5890  Progress: 3796 on 5890  Progress: 3797 on 5890  Progress: 3798 on 5890  Progress: 3799 on 5890  Progress: 3800 on 5890  Progress: 3801 on 5890  Progress: 3802 on 5890  Progress: 3803 on 5890  Progress: 3804 on 5890  Progress: 3805 on 5890  Progress: 3806 on 5890  Progress: 3807 on 5890  Progress: 3808 on 5890  Progress: 3809 on 5890  Progress: 3810 on 5890  Progress: 3811 on 5890  Progress: 3812 on 5890  Progress: 3813 on 5890  Progress: 3814 on 5890  Progress: 3815 on 5890  Progress: 3816 on 5890  Progress: 3817 on 5890  Progress: 3818 on 5890  Progress: 3819 on 5890  Progress: 3820 on 5890  Progress: 3821 on 5890  Progress: 3822 on 5890  Progress: 3823 on 5890  Progress: 3824 on 5890  Progress: 3825 on 5890  Progress: 3826 on 5890  Progress: 3827 on 5890  Progress: 3828 on 5890  Progress: 3829 on 5890  Progress: 3830 on 5890  Progress: 3831 on 5890  Progress: 3832 on 5890  Progress: 3833 on 5890  Progress: 3834 on 5890  Progress: 3835 on 5890  Progress: 3836 on 5890  Progress: 3837 on 5890  Progress: 3838 on 5890  Progress: 3839 on 5890  Progress: 3840 on 5890  Progress: 3841 on 5890  Progress: 3842 on 5890  Progress: 3843 on 5890  Progress: 3844 on 5890  Progress: 3845 on 5890  Progress: 3846 on 5890  Progress: 3847 on 5890  Progress: 3848 on 5890  Progress: 3849 on 5890  Progress: 3850 on 5890  Progress: 3851 on 5890  Progress: 3852 on 5890  Progress: 3853 on 5890  Progress: 3854 on 5890  Progress: 3855 on 5890  Progress: 3856 on 5890  Progress: 3857 on 5890  Progress: 3858 on 5890  Progress: 3859 on 5890  Progress: 3860 on 5890  Progress: 3861 on 5890  Progress: 3862 on 5890  Progress: 3863 on 5890  Progress: 3864 on 5890  Progress: 3865 on 5890  Progress: 3866 on 5890  Progress: 3867 on 5890  Progress: 3868 on 5890  Progress: 3869 on 5890  Progress: 3870 on 5890  Progress: 3871 on 5890  Progress: 3872 on 5890  Progress: 3873 on 5890  Progress: 3874 on 5890  Progress: 3875 on 5890  Progress: 3876 on 5890  Progress: 3877 on 5890  Progress: 3878 on 5890  Progress: 3879 on 5890  Progress: 3880 on 5890  Progress: 3881 on 5890  Progress: 3882 on 5890  Progress: 3883 on 5890  Progress: 3884 on 5890  Progress: 3885 on 5890  Progress: 3886 on 5890  Progress: 3887 on 5890  Progress: 3888 on 5890  Progress: 3889 on 5890  Progress: 3890 on 5890  Progress: 3891 on 5890  Progress: 3892 on 5890  Progress: 3893 on 5890  Progress: 3894 on 5890  Progress: 3895 on 5890  Progress: 3896 on 5890  Progress: 3897 on 5890  Progress: 3898 on 5890  Progress: 3899 on 5890  Progress: 3900 on 5890  Progress: 3901 on 5890  Progress: 3902 on 5890  Progress: 3903 on 5890  Progress: 3904 on 5890  Progress: 3905 on 5890  Progress: 3906 on 5890  Progress: 3907 on 5890  Progress: 3908 on 5890  Progress: 3909 on 5890  Progress: 3910 on 5890  Progress: 3911 on 5890  Progress: 3912 on 5890  Progress: 3913 on 5890  Progress: 3914 on 5890  Progress: 3915 on 5890  Progress: 3916 on 5890  Progress: 3917 on 5890  Progress: 3918 on 5890  Progress: 3919 on 5890  Progress: 3920 on 5890  Progress: 3921 on 5890  Progress: 3922 on 5890  Progress: 3923 on 5890  Progress: 3924 on 5890  Progress: 3925 on 5890  Progress: 3926 on 5890  Progress: 3927 on 5890  Progress: 3928 on 5890  Progress: 3929 on 5890  Progress: 3930 on 5890  Progress: 3931 on 5890  Progress: 3932 on 5890  Progress: 3933 on 5890  Progress: 3934 on 5890  Progress: 3935 on 5890  Progress: 3936 on 5890  Progress: 3937 on 5890  Progress: 3938 on 5890  Progress: 3939 on 5890  Progress: 3940 on 5890  Progress: 3941 on 5890  Progress: 3942 on 5890  Progress: 3943 on 5890  Progress: 3944 on 5890  Progress: 3945 on 5890  Progress: 3946 on 5890  Progress: 3947 on 5890  Progress: 3948 on 5890  Progress: 3949 on 5890  Progress: 3950 on 5890  Progress: 3951 on 5890  Progress: 3952 on 5890  Progress: 3953 on 5890  Progress: 3954 on 5890  Progress: 3955 on 5890  Progress: 3956 on 5890  Progress: 3957 on 5890  Progress: 3958 on 5890  Progress: 3959 on 5890  Progress: 3960 on 5890  Progress: 3961 on 5890  Progress: 3962 on 5890  Progress: 3963 on 5890  Progress: 3964 on 5890  Progress: 3965 on 5890  Progress: 3966 on 5890  Progress: 3967 on 5890  Progress: 3968 on 5890  Progress: 3969 on 5890  Progress: 3970 on 5890  Progress: 3971 on 5890  Progress: 3972 on 5890  Progress: 3973 on 5890  Progress: 3974 on 5890  Progress: 3975 on 5890  Progress: 3976 on 5890  Progress: 3977 on 5890  Progress: 3978 on 5890  Progress: 3979 on 5890  Progress: 3980 on 5890  Progress: 3981 on 5890  Progress: 3982 on 5890  Progress: 3983 on 5890  Progress: 3984 on 5890  Progress: 3985 on 5890  Progress: 3986 on 5890  Progress: 3987 on 5890  Progress: 3988 on 5890  Progress: 3989 on 5890  Progress: 3990 on 5890  Progress: 3991 on 5890  Progress: 3992 on 5890  Progress: 3993 on 5890  Progress: 3994 on 5890  Progress: 3995 on 5890  Progress: 3996 on 5890  Progress: 3997 on 5890  Progress: 3998 on 5890  Progress: 3999 on 5890  Progress: 4000 on 5890  Progress: 4001 on 5890  Progress: 4002 on 5890  Progress: 4003 on 5890  Progress: 4004 on 5890  Progress: 4005 on 5890  Progress: 4006 on 5890  Progress: 4007 on 5890  Progress: 4008 on 5890  Progress: 4009 on 5890  Progress: 4010 on 5890  Progress: 4011 on 5890  Progress: 4012 on 5890  Progress: 4013 on 5890  Progress: 4014 on 5890  Progress: 4015 on 5890  Progress: 4016 on 5890  Progress: 4017 on 5890  Progress: 4018 on 5890  Progress: 4019 on 5890  Progress: 4020 on 5890  Progress: 4021 on 5890  Progress: 4022 on 5890  Progress: 4023 on 5890  Progress: 4024 on 5890  Progress: 4025 on 5890  Progress: 4026 on 5890  Progress: 4027 on 5890  Progress: 4028 on 5890  Progress: 4029 on 5890  Progress: 4030 on 5890  Progress: 4031 on 5890  Progress: 4032 on 5890  Progress: 4033 on 5890  Progress: 4034 on 5890  Progress: 4035 on 5890  Progress: 4036 on 5890  Progress: 4037 on 5890  Progress: 4038 on 5890  Progress: 4039 on 5890  Progress: 4040 on 5890  Progress: 4041 on 5890  Progress: 4042 on 5890  Progress: 4043 on 5890  Progress: 4044 on 5890  Progress: 4045 on 5890  Progress: 4046 on 5890  Progress: 4047 on 5890  Progress: 4048 on 5890  Progress: 4049 on 5890  Progress: 4050 on 5890  Progress: 4051 on 5890  Progress: 4052 on 5890  Progress: 4053 on 5890  Progress: 4054 on 5890  Progress: 4055 on 5890  Progress: 4056 on 5890  Progress: 4057 on 5890  Progress: 4058 on 5890  Progress: 4059 on 5890  Progress: 4060 on 5890  Progress: 4061 on 5890  Progress: 4062 on 5890  Progress: 4063 on 5890  Progress: 4064 on 5890  Progress: 4065 on 5890  Progress: 4066 on 5890  Progress: 4067 on 5890  Progress: 4068 on 5890  Progress: 4069 on 5890  Progress: 4070 on 5890  Progress: 4071 on 5890  Progress: 4072 on 5890  Progress: 4073 on 5890  Progress: 4074 on 5890  Progress: 4075 on 5890  Progress: 4076 on 5890  Progress: 4077 on 5890  Progress: 4078 on 5890  Progress: 4079 on 5890  Progress: 4080 on 5890  Progress: 4081 on 5890  Progress: 4082 on 5890  Progress: 4083 on 5890  Progress: 4084 on 5890  Progress: 4085 on 5890  Progress: 4086 on 5890  Progress: 4087 on 5890  Progress: 4088 on 5890  Progress: 4089 on 5890  Progress: 4090 on 5890  Progress: 4091 on 5890  Progress: 4092 on 5890  Progress: 4093 on 5890  Progress: 4094 on 5890  Progress: 4095 on 5890  Progress: 4096 on 5890  Progress: 4097 on 5890  Progress: 4098 on 5890  Progress: 4099 on 5890  Progress: 4100 on 5890  Progress: 4101 on 5890  Progress: 4102 on 5890  Progress: 4103 on 5890  Progress: 4104 on 5890  Progress: 4105 on 5890  Progress: 4106 on 5890  Progress: 4107 on 5890  Progress: 4108 on 5890  Progress: 4109 on 5890  Progress: 4110 on 5890  Progress: 4111 on 5890  Progress: 4112 on 5890  Progress: 4113 on 5890  Progress: 4114 on 5890  Progress: 4115 on 5890  Progress: 4116 on 5890  Progress: 4117 on 5890  Progress: 4118 on 5890  Progress: 4119 on 5890  Progress: 4120 on 5890  Progress: 4121 on 5890  Progress: 4122 on 5890  Progress: 4123 on 5890  Progress: 4124 on 5890  Progress: 4125 on 5890  Progress: 4126 on 5890  Progress: 4127 on 5890  Progress: 4128 on 5890  Progress: 4129 on 5890  Progress: 4130 on 5890  Progress: 4131 on 5890  Progress: 4132 on 5890  Progress: 4133 on 5890  Progress: 4134 on 5890  Progress: 4135 on 5890  Progress: 4136 on 5890  Progress: 4137 on 5890  Progress: 4138 on 5890  Progress: 4139 on 5890  Progress: 4140 on 5890  Progress: 4141 on 5890  Progress: 4142 on 5890  Progress: 4143 on 5890  Progress: 4144 on 5890  Progress: 4145 on 5890  Progress: 4146 on 5890  Progress: 4147 on 5890  Progress: 4148 on 5890  Progress: 4149 on 5890  Progress: 4150 on 5890  Progress: 4151 on 5890  Progress: 4152 on 5890  Progress: 4153 on 5890  Progress: 4154 on 5890  Progress: 4155 on 5890  Progress: 4156 on 5890  Progress: 4157 on 5890  Progress: 4158 on 5890  Progress: 4159 on 5890  Progress: 4160 on 5890  Progress: 4161 on 5890  Progress: 4162 on 5890  Progress: 4163 on 5890  Progress: 4164 on 5890  Progress: 4165 on 5890  Progress: 4166 on 5890  Progress: 4167 on 5890  Progress: 4168 on 5890  Progress: 4169 on 5890  Progress: 4170 on 5890  Progress: 4171 on 5890  Progress: 4172 on 5890  Progress: 4173 on 5890  Progress: 4174 on 5890  Progress: 4175 on 5890  Progress: 4176 on 5890  Progress: 4177 on 5890  Progress: 4178 on 5890  Progress: 4179 on 5890  Progress: 4180 on 5890  Progress: 4181 on 5890  Progress: 4182 on 5890  Progress: 4183 on 5890  Progress: 4184 on 5890  Progress: 4185 on 5890  Progress: 4186 on 5890  Progress: 4187 on 5890  Progress: 4188 on 5890  Progress: 4189 on 5890  Progress: 4190 on 5890  Progress: 4191 on 5890  Progress: 4192 on 5890  Progress: 4193 on 5890  Progress: 4194 on 5890  Progress: 4195 on 5890  Progress: 4196 on 5890  Progress: 4197 on 5890  Progress: 4198 on 5890  Progress: 4199 on 5890  Progress: 4200 on 5890  Progress: 4201 on 5890  Progress: 4202 on 5890  Progress: 4203 on 5890  Progress: 4204 on 5890  Progress: 4205 on 5890  Progress: 4206 on 5890  Progress: 4207 on 5890  Progress: 4208 on 5890  Progress: 4209 on 5890  Progress: 4210 on 5890  Progress: 4211 on 5890  Progress: 4212 on 5890  Progress: 4213 on 5890  Progress: 4214 on 5890  Progress: 4215 on 5890  Progress: 4216 on 5890  Progress: 4217 on 5890  Progress: 4218 on 5890  Progress: 4219 on 5890  Progress: 4220 on 5890  Progress: 4221 on 5890  Progress: 4222 on 5890  Progress: 4223 on 5890  Progress: 4224 on 5890  Progress: 4225 on 5890  Progress: 4226 on 5890  Progress: 4227 on 5890  Progress: 4228 on 5890  Progress: 4229 on 5890  Progress: 4230 on 5890  Progress: 4231 on 5890  Progress: 4232 on 5890  Progress: 4233 on 5890  Progress: 4234 on 5890  Progress: 4235 on 5890  Progress: 4236 on 5890  Progress: 4237 on 5890  Progress: 4238 on 5890  Progress: 4239 on 5890  Progress: 4240 on 5890  Progress: 4241 on 5890  Progress: 4242 on 5890  Progress: 4243 on 5890  Progress: 4244 on 5890  Progress: 4245 on 5890  Progress: 4246 on 5890  Progress: 4247 on 5890  Progress: 4248 on 5890  Progress: 4249 on 5890  Progress: 4250 on 5890  Progress: 4251 on 5890  Progress: 4252 on 5890  Progress: 4253 on 5890  Progress: 4254 on 5890  Progress: 4255 on 5890  Progress: 4256 on 5890  Progress: 4257 on 5890  Progress: 4258 on 5890  Progress: 4259 on 5890  Progress: 4260 on 5890  Progress: 4261 on 5890  Progress: 4262 on 5890  Progress: 4263 on 5890  Progress: 4264 on 5890  Progress: 4265 on 5890  Progress: 4266 on 5890  Progress: 4267 on 5890  Progress: 4268 on 5890  Progress: 4269 on 5890  Progress: 4270 on 5890  Progress: 4271 on 5890  Progress: 4272 on 5890  Progress: 4273 on 5890  Progress: 4274 on 5890  Progress: 4275 on 5890  Progress: 4276 on 5890  Progress: 4277 on 5890  Progress: 4278 on 5890  Progress: 4279 on 5890  Progress: 4280 on 5890  Progress: 4281 on 5890  Progress: 4282 on 5890  Progress: 4283 on 5890  Progress: 4284 on 5890  Progress: 4285 on 5890  Progress: 4286 on 5890  Progress: 4287 on 5890  Progress: 4288 on 5890  Progress: 4289 on 5890  Progress: 4290 on 5890  Progress: 4291 on 5890  Progress: 4292 on 5890  Progress: 4293 on 5890  Progress: 4294 on 5890  Progress: 4295 on 5890  Progress: 4296 on 5890  Progress: 4297 on 5890  Progress: 4298 on 5890  Progress: 4299 on 5890  Progress: 4300 on 5890  Progress: 4301 on 5890  Progress: 4302 on 5890  Progress: 4303 on 5890  Progress: 4304 on 5890  Progress: 4305 on 5890  Progress: 4306 on 5890  Progress: 4307 on 5890  Progress: 4308 on 5890  Progress: 4309 on 5890  Progress: 4310 on 5890  Progress: 4311 on 5890  Progress: 4312 on 5890  Progress: 4313 on 5890  Progress: 4314 on 5890  Progress: 4315 on 5890  Progress: 4316 on 5890  Progress: 4317 on 5890  Progress: 4318 on 5890  Progress: 4319 on 5890  Progress: 4320 on 5890  Progress: 4321 on 5890  Progress: 4322 on 5890  Progress: 4323 on 5890  Progress: 4324 on 5890  Progress: 4325 on 5890  Progress: 4326 on 5890  Progress: 4327 on 5890  Progress: 4328 on 5890  Progress: 4329 on 5890  Progress: 4330 on 5890  Progress: 4331 on 5890  Progress: 4332 on 5890  Progress: 4333 on 5890  Progress: 4334 on 5890  Progress: 4335 on 5890  Progress: 4336 on 5890  Progress: 4337 on 5890  Progress: 4338 on 5890  Progress: 4339 on 5890  Progress: 4340 on 5890  Progress: 4341 on 5890  Progress: 4342 on 5890  Progress: 4343 on 5890  Progress: 4344 on 5890  Progress: 4345 on 5890  Progress: 4346 on 5890  Progress: 4347 on 5890  Progress: 4348 on 5890  Progress: 4349 on 5890  Progress: 4350 on 5890  Progress: 4351 on 5890  Progress: 4352 on 5890  Progress: 4353 on 5890  Progress: 4354 on 5890  Progress: 4355 on 5890  Progress: 4356 on 5890  Progress: 4357 on 5890  Progress: 4358 on 5890  Progress: 4359 on 5890  Progress: 4360 on 5890  Progress: 4361 on 5890  Progress: 4362 on 5890  Progress: 4363 on 5890  Progress: 4364 on 5890  Progress: 4365 on 5890  Progress: 4366 on 5890  Progress: 4367 on 5890  Progress: 4368 on 5890  Progress: 4369 on 5890  Progress: 4370 on 5890  Progress: 4371 on 5890  Progress: 4372 on 5890  Progress: 4373 on 5890  Progress: 4374 on 5890  Progress: 4375 on 5890  Progress: 4376 on 5890  Progress: 4377 on 5890  Progress: 4378 on 5890  Progress: 4379 on 5890  Progress: 4380 on 5890  Progress: 4381 on 5890  Progress: 4382 on 5890  Progress: 4383 on 5890  Progress: 4384 on 5890  Progress: 4385 on 5890  Progress: 4386 on 5890  Progress: 4387 on 5890  Progress: 4388 on 5890  Progress: 4389 on 5890  Progress: 4390 on 5890  Progress: 4391 on 5890  Progress: 4392 on 5890  Progress: 4393 on 5890  Progress: 4394 on 5890  Progress: 4395 on 5890  Progress: 4396 on 5890  Progress: 4397 on 5890  Progress: 4398 on 5890  Progress: 4399 on 5890  Progress: 4400 on 5890  Progress: 4401 on 5890  Progress: 4402 on 5890  Progress: 4403 on 5890  Progress: 4404 on 5890  Progress: 4405 on 5890  Progress: 4406 on 5890  Progress: 4407 on 5890  Progress: 4408 on 5890  Progress: 4409 on 5890  Progress: 4410 on 5890  Progress: 4411 on 5890  Progress: 4412 on 5890  Progress: 4413 on 5890  Progress: 4414 on 5890  Progress: 4415 on 5890  Progress: 4416 on 5890  Progress: 4417 on 5890  Progress: 4418 on 5890  Progress: 4419 on 5890  Progress: 4420 on 5890  Progress: 4421 on 5890  Progress: 4422 on 5890  Progress: 4423 on 5890  Progress: 4424 on 5890  Progress: 4425 on 5890  Progress: 4426 on 5890  Progress: 4427 on 5890  Progress: 4428 on 5890  Progress: 4429 on 5890  Progress: 4430 on 5890  Progress: 4431 on 5890  Progress: 4432 on 5890  Progress: 4433 on 5890  Progress: 4434 on 5890  Progress: 4435 on 5890  Progress: 4436 on 5890  Progress: 4437 on 5890  Progress: 4438 on 5890  Progress: 4439 on 5890  Progress: 4440 on 5890  Progress: 4441 on 5890  Progress: 4442 on 5890  Progress: 4443 on 5890  Progress: 4444 on 5890  Progress: 4445 on 5890  Progress: 4446 on 5890  Progress: 4447 on 5890  Progress: 4448 on 5890  Progress: 4449 on 5890  Progress: 4450 on 5890  Progress: 4451 on 5890  Progress: 4452 on 5890  Progress: 4453 on 5890  Progress: 4454 on 5890  Progress: 4455 on 5890  Progress: 4456 on 5890  Progress: 4457 on 5890  Progress: 4458 on 5890  Progress: 4459 on 5890  Progress: 4460 on 5890  Progress: 4461 on 5890  Progress: 4462 on 5890  Progress: 4463 on 5890  Progress: 4464 on 5890  Progress: 4465 on 5890  Progress: 4466 on 5890  Progress: 4467 on 5890  Progress: 4468 on 5890  Progress: 4469 on 5890  Progress: 4470 on 5890  Progress: 4471 on 5890  Progress: 4472 on 5890  Progress: 4473 on 5890  Progress: 4474 on 5890  Progress: 4475 on 5890  Progress: 4476 on 5890  Progress: 4477 on 5890  Progress: 4478 on 5890  Progress: 4479 on 5890  Progress: 4480 on 5890  Progress: 4481 on 5890  Progress: 4482 on 5890  Progress: 4483 on 5890  Progress: 4484 on 5890  Progress: 4485 on 5890  Progress: 4486 on 5890  Progress: 4487 on 5890  Progress: 4488 on 5890  Progress: 4489 on 5890  Progress: 4490 on 5890  Progress: 4491 on 5890  Progress: 4492 on 5890  Progress: 4493 on 5890  Progress: 4494 on 5890  Progress: 4495 on 5890  Progress: 4496 on 5890  Progress: 4497 on 5890  Progress: 4498 on 5890  Progress: 4499 on 5890  Progress: 4500 on 5890  Progress: 4501 on 5890  Progress: 4502 on 5890  Progress: 4503 on 5890  Progress: 4504 on 5890  Progress: 4505 on 5890  Progress: 4506 on 5890  Progress: 4507 on 5890  Progress: 4508 on 5890  Progress: 4509 on 5890  Progress: 4510 on 5890  Progress: 4511 on 5890  Progress: 4512 on 5890  Progress: 4513 on 5890  Progress: 4514 on 5890  Progress: 4515 on 5890  Progress: 4516 on 5890  Progress: 4517 on 5890  Progress: 4518 on 5890  Progress: 4519 on 5890  Progress: 4520 on 5890  Progress: 4521 on 5890  Progress: 4522 on 5890  Progress: 4523 on 5890  Progress: 4524 on 5890  Progress: 4525 on 5890  Progress: 4526 on 5890  Progress: 4527 on 5890  Progress: 4528 on 5890  Progress: 4529 on 5890  Progress: 4530 on 5890  Progress: 4531 on 5890  Progress: 4532 on 5890  Progress: 4533 on 5890  Progress: 4534 on 5890  Progress: 4535 on 5890  Progress: 4536 on 5890  Progress: 4537 on 5890  Progress: 4538 on 5890  Progress: 4539 on 5890  Progress: 4540 on 5890  Progress: 4541 on 5890  Progress: 4542 on 5890  Progress: 4543 on 5890  Progress: 4544 on 5890  Progress: 4545 on 5890  Progress: 4546 on 5890  Progress: 4547 on 5890  Progress: 4548 on 5890  Progress: 4549 on 5890  Progress: 4550 on 5890  Progress: 4551 on 5890  Progress: 4552 on 5890  Progress: 4553 on 5890  Progress: 4554 on 5890  Progress: 4555 on 5890  Progress: 4556 on 5890  Progress: 4557 on 5890  Progress: 4558 on 5890  Progress: 4559 on 5890  Progress: 4560 on 5890  Progress: 4561 on 5890  Progress: 4562 on 5890  Progress: 4563 on 5890  Progress: 4564 on 5890  Progress: 4565 on 5890  Progress: 4566 on 5890  Progress: 4567 on 5890  Progress: 4568 on 5890  Progress: 4569 on 5890  Progress: 4570 on 5890  Progress: 4571 on 5890  Progress: 4572 on 5890  Progress: 4573 on 5890  Progress: 4574 on 5890  Progress: 4575 on 5890  Progress: 4576 on 5890  Progress: 4577 on 5890  Progress: 4578 on 5890  Progress: 4579 on 5890  Progress: 4580 on 5890  Progress: 4581 on 5890  Progress: 4582 on 5890  Progress: 4583 on 5890  Progress: 4584 on 5890  Progress: 4585 on 5890  Progress: 4586 on 5890  Progress: 4587 on 5890  Progress: 4588 on 5890  Progress: 4589 on 5890  Progress: 4590 on 5890  Progress: 4591 on 5890  Progress: 4592 on 5890  Progress: 4593 on 5890  Progress: 4594 on 5890  Progress: 4595 on 5890  Progress: 4596 on 5890  Progress: 4597 on 5890  Progress: 4598 on 5890  Progress: 4599 on 5890  Progress: 4600 on 5890  Progress: 4601 on 5890  Progress: 4602 on 5890  Progress: 4603 on 5890  Progress: 4604 on 5890  Progress: 4605 on 5890  Progress: 4606 on 5890  Progress: 4607 on 5890  Progress: 4608 on 5890  Progress: 4609 on 5890  Progress: 4610 on 5890  Progress: 4611 on 5890  Progress: 4612 on 5890  Progress: 4613 on 5890  Progress: 4614 on 5890  Progress: 4615 on 5890  Progress: 4616 on 5890  Progress: 4617 on 5890  Progress: 4618 on 5890  Progress: 4619 on 5890  Progress: 4620 on 5890  Progress: 4621 on 5890  Progress: 4622 on 5890  Progress: 4623 on 5890  Progress: 4624 on 5890  Progress: 4625 on 5890  Progress: 4626 on 5890  Progress: 4627 on 5890  Progress: 4628 on 5890  Progress: 4629 on 5890  Progress: 4630 on 5890  Progress: 4631 on 5890  Progress: 4632 on 5890  Progress: 4633 on 5890  Progress: 4634 on 5890  Progress: 4635 on 5890  Progress: 4636 on 5890  Progress: 4637 on 5890  Progress: 4638 on 5890  Progress: 4639 on 5890  Progress: 4640 on 5890  Progress: 4641 on 5890  Progress: 4642 on 5890  Progress: 4643 on 5890  Progress: 4644 on 5890  Progress: 4645 on 5890  Progress: 4646 on 5890  Progress: 4647 on 5890  Progress: 4648 on 5890  Progress: 4649 on 5890  Progress: 4650 on 5890  Progress: 4651 on 5890  Progress: 4652 on 5890  Progress: 4653 on 5890  Progress: 4654 on 5890  Progress: 4655 on 5890  Progress: 4656 on 5890  Progress: 4657 on 5890  Progress: 4658 on 5890  Progress: 4659 on 5890  Progress: 4660 on 5890  Progress: 4661 on 5890  Progress: 4662 on 5890  Progress: 4663 on 5890  Progress: 4664 on 5890  Progress: 4665 on 5890  Progress: 4666 on 5890  Progress: 4667 on 5890  Progress: 4668 on 5890  Progress: 4669 on 5890  Progress: 4670 on 5890  Progress: 4671 on 5890  Progress: 4672 on 5890  Progress: 4673 on 5890  Progress: 4674 on 5890  Progress: 4675 on 5890  Progress: 4676 on 5890  Progress: 4677 on 5890  Progress: 4678 on 5890  Progress: 4679 on 5890  Progress: 4680 on 5890  Progress: 4681 on 5890  Progress: 4682 on 5890  Progress: 4683 on 5890  Progress: 4684 on 5890  Progress: 4685 on 5890  Progress: 4686 on 5890  Progress: 4687 on 5890  Progress: 4688 on 5890  Progress: 4689 on 5890  Progress: 4690 on 5890  Progress: 4691 on 5890  Progress: 4692 on 5890  Progress: 4693 on 5890  Progress: 4694 on 5890  Progress: 4695 on 5890  Progress: 4696 on 5890  Progress: 4697 on 5890  Progress: 4698 on 5890  Progress: 4699 on 5890  Progress: 4700 on 5890  Progress: 4701 on 5890  Progress: 4702 on 5890  Progress: 4703 on 5890  Progress: 4704 on 5890  Progress: 4705 on 5890  Progress: 4706 on 5890  Progress: 4707 on 5890  Progress: 4708 on 5890  Progress: 4709 on 5890  Progress: 4710 on 5890  Progress: 4711 on 5890  Progress: 4712 on 5890  Progress: 4713 on 5890  Progress: 4714 on 5890  Progress: 4715 on 5890  Progress: 4716 on 5890  Progress: 4717 on 5890  Progress: 4718 on 5890  Progress: 4719 on 5890  Progress: 4720 on 5890  Progress: 4721 on 5890  Progress: 4722 on 5890  Progress: 4723 on 5890  Progress: 4724 on 5890  Progress: 4725 on 5890  Progress: 4726 on 5890  Progress: 4727 on 5890  Progress: 4728 on 5890  Progress: 4729 on 5890  Progress: 4730 on 5890  Progress: 4731 on 5890  Progress: 4732 on 5890  Progress: 4733 on 5890  Progress: 4734 on 5890  Progress: 4735 on 5890  Progress: 4736 on 5890  Progress: 4737 on 5890  Progress: 4738 on 5890  Progress: 4739 on 5890  Progress: 4740 on 5890  Progress: 4741 on 5890  Progress: 4742 on 5890  Progress: 4743 on 5890  Progress: 4744 on 5890  Progress: 4745 on 5890  Progress: 4746 on 5890  Progress: 4747 on 5890  Progress: 4748 on 5890  Progress: 4749 on 5890  Progress: 4750 on 5890  Progress: 4751 on 5890  Progress: 4752 on 5890  Progress: 4753 on 5890  Progress: 4754 on 5890  Progress: 4755 on 5890  Progress: 4756 on 5890  Progress: 4757 on 5890  Progress: 4758 on 5890  Progress: 4759 on 5890  Progress: 4760 on 5890  Progress: 4761 on 5890  Progress: 4762 on 5890  Progress: 4763 on 5890  Progress: 4764 on 5890  Progress: 4765 on 5890  Progress: 4766 on 5890  Progress: 4767 on 5890  Progress: 4768 on 5890  Progress: 4769 on 5890  Progress: 4770 on 5890  Progress: 4771 on 5890  Progress: 4772 on 5890  Progress: 4773 on 5890  Progress: 4774 on 5890  Progress: 4775 on 5890  Progress: 4776 on 5890  Progress: 4777 on 5890  Progress: 4778 on 5890  Progress: 4779 on 5890  Progress: 4780 on 5890  Progress: 4781 on 5890  Progress: 4782 on 5890  Progress: 4783 on 5890  Progress: 4784 on 5890  Progress: 4785 on 5890  Progress: 4786 on 5890  Progress: 4787 on 5890  Progress: 4788 on 5890  Progress: 4789 on 5890  Progress: 4790 on 5890  Progress: 4791 on 5890  Progress: 4792 on 5890  Progress: 4793 on 5890  Progress: 4794 on 5890  Progress: 4795 on 5890  Progress: 4796 on 5890  Progress: 4797 on 5890  Progress: 4798 on 5890  Progress: 4799 on 5890  Progress: 4800 on 5890  Progress: 4801 on 5890  Progress: 4802 on 5890  Progress: 4803 on 5890  Progress: 4804 on 5890  Progress: 4805 on 5890  Progress: 4806 on 5890  Progress: 4807 on 5890  Progress: 4808 on 5890  Progress: 4809 on 5890  Progress: 4810 on 5890  Progress: 4811 on 5890  Progress: 4812 on 5890  Progress: 4813 on 5890  Progress: 4814 on 5890  Progress: 4815 on 5890  Progress: 4816 on 5890  Progress: 4817 on 5890  Progress: 4818 on 5890  Progress: 4819 on 5890  Progress: 4820 on 5890  Progress: 4821 on 5890  Progress: 4822 on 5890  Progress: 4823 on 5890  Progress: 4824 on 5890  Progress: 4825 on 5890  Progress: 4826 on 5890  Progress: 4827 on 5890  Progress: 4828 on 5890  Progress: 4829 on 5890  Progress: 4830 on 5890  Progress: 4831 on 5890  Progress: 4832 on 5890  Progress: 4833 on 5890  Progress: 4834 on 5890  Progress: 4835 on 5890  Progress: 4836 on 5890  Progress: 4837 on 5890  Progress: 4838 on 5890  Progress: 4839 on 5890  Progress: 4840 on 5890  Progress: 4841 on 5890  Progress: 4842 on 5890  Progress: 4843 on 5890  Progress: 4844 on 5890  Progress: 4845 on 5890  Progress: 4846 on 5890  Progress: 4847 on 5890  Progress: 4848 on 5890  Progress: 4849 on 5890  Progress: 4850 on 5890  Progress: 4851 on 5890  Progress: 4852 on 5890  Progress: 4853 on 5890  Progress: 4854 on 5890  Progress: 4855 on 5890  Progress: 4856 on 5890  Progress: 4857 on 5890  Progress: 4858 on 5890  Progress: 4859 on 5890  Progress: 4860 on 5890  Progress: 4861 on 5890  Progress: 4862 on 5890  Progress: 4863 on 5890  Progress: 4864 on 5890  Progress: 4865 on 5890  Progress: 4866 on 5890  Progress: 4867 on 5890  Progress: 4868 on 5890  Progress: 4869 on 5890  Progress: 4870 on 5890  Progress: 4871 on 5890  Progress: 4872 on 5890  Progress: 4873 on 5890  Progress: 4874 on 5890  Progress: 4875 on 5890  Progress: 4876 on 5890  Progress: 4877 on 5890  Progress: 4878 on 5890  Progress: 4879 on 5890  Progress: 4880 on 5890  Progress: 4881 on 5890  Progress: 4882 on 5890  Progress: 4883 on 5890  Progress: 4884 on 5890  Progress: 4885 on 5890  Progress: 4886 on 5890  Progress: 4887 on 5890  Progress: 4888 on 5890  Progress: 4889 on 5890  Progress: 4890 on 5890  Progress: 4891 on 5890  Progress: 4892 on 5890  Progress: 4893 on 5890  Progress: 4894 on 5890  Progress: 4895 on 5890  Progress: 4896 on 5890  Progress: 4897 on 5890  Progress: 4898 on 5890  Progress: 4899 on 5890  Progress: 4900 on 5890  Progress: 4901 on 5890  Progress: 4902 on 5890  Progress: 4903 on 5890  Progress: 4904 on 5890  Progress: 4905 on 5890  Progress: 4906 on 5890  Progress: 4907 on 5890  Progress: 4908 on 5890  Progress: 4909 on 5890  Progress: 4910 on 5890  Progress: 4911 on 5890  Progress: 4912 on 5890  Progress: 4913 on 5890  Progress: 4914 on 5890  Progress: 4915 on 5890  Progress: 4916 on 5890  Progress: 4917 on 5890  Progress: 4918 on 5890  Progress: 4919 on 5890  Progress: 4920 on 5890  Progress: 4921 on 5890  Progress: 4922 on 5890  Progress: 4923 on 5890  Progress: 4924 on 5890  Progress: 4925 on 5890  Progress: 4926 on 5890  Progress: 4927 on 5890  Progress: 4928 on 5890  Progress: 4929 on 5890  Progress: 4930 on 5890  Progress: 4931 on 5890  Progress: 4932 on 5890  Progress: 4933 on 5890  Progress: 4934 on 5890  Progress: 4935 on 5890  Progress: 4936 on 5890  Progress: 4937 on 5890  Progress: 4938 on 5890  Progress: 4939 on 5890  Progress: 4940 on 5890  Progress: 4941 on 5890  Progress: 4942 on 5890  Progress: 4943 on 5890  Progress: 4944 on 5890  Progress: 4945 on 5890  Progress: 4946 on 5890  Progress: 4947 on 5890  Progress: 4948 on 5890  Progress: 4949 on 5890  Progress: 4950 on 5890  Progress: 4951 on 5890  Progress: 4952 on 5890  Progress: 4953 on 5890  Progress: 4954 on 5890  Progress: 4955 on 5890  Progress: 4956 on 5890  Progress: 4957 on 5890  Progress: 4958 on 5890  Progress: 4959 on 5890  Progress: 4960 on 5890  Progress: 4961 on 5890  Progress: 4962 on 5890  Progress: 4963 on 5890  Progress: 4964 on 5890  Progress: 4965 on 5890  Progress: 4966 on 5890  Progress: 4967 on 5890  Progress: 4968 on 5890  Progress: 4969 on 5890  Progress: 4970 on 5890  Progress: 4971 on 5890  Progress: 4972 on 5890  Progress: 4973 on 5890  Progress: 4974 on 5890  Progress: 4975 on 5890  Progress: 4976 on 5890  Progress: 4977 on 5890  Progress: 4978 on 5890  Progress: 4979 on 5890  Progress: 4980 on 5890  Progress: 4981 on 5890  Progress: 4982 on 5890  Progress: 4983 on 5890  Progress: 4984 on 5890  Progress: 4985 on 5890  Progress: 4986 on 5890  Progress: 4987 on 5890  Progress: 4988 on 5890  Progress: 4989 on 5890  Progress: 4990 on 5890  Progress: 4991 on 5890  Progress: 4992 on 5890  Progress: 4993 on 5890  Progress: 4994 on 5890  Progress: 4995 on 5890  Progress: 4996 on 5890  Progress: 4997 on 5890  Progress: 4998 on 5890  Progress: 4999 on 5890  Progress: 5000 on 5890  Progress: 5001 on 5890  Progress: 5002 on 5890  Progress: 5003 on 5890  Progress: 5004 on 5890  Progress: 5005 on 5890  Progress: 5006 on 5890  Progress: 5007 on 5890  Progress: 5008 on 5890  Progress: 5009 on 5890  Progress: 5010 on 5890  Progress: 5011 on 5890  Progress: 5012 on 5890  Progress: 5013 on 5890  Progress: 5014 on 5890  Progress: 5015 on 5890  Progress: 5016 on 5890  Progress: 5017 on 5890  Progress: 5018 on 5890  Progress: 5019 on 5890  Progress: 5020 on 5890  Progress: 5021 on 5890  Progress: 5022 on 5890  Progress: 5023 on 5890  Progress: 5024 on 5890  Progress: 5025 on 5890  Progress: 5026 on 5890  Progress: 5027 on 5890  Progress: 5028 on 5890  Progress: 5029 on 5890  Progress: 5030 on 5890  Progress: 5031 on 5890  Progress: 5032 on 5890  Progress: 5033 on 5890  Progress: 5034 on 5890  Progress: 5035 on 5890  Progress: 5036 on 5890  Progress: 5037 on 5890  Progress: 5038 on 5890  Progress: 5039 on 5890  Progress: 5040 on 5890  Progress: 5041 on 5890  Progress: 5042 on 5890  Progress: 5043 on 5890  Progress: 5044 on 5890  Progress: 5045 on 5890  Progress: 5046 on 5890  Progress: 5047 on 5890  Progress: 5048 on 5890  Progress: 5049 on 5890  Progress: 5050 on 5890  Progress: 5051 on 5890  Progress: 5052 on 5890  Progress: 5053 on 5890  Progress: 5054 on 5890  Progress: 5055 on 5890  Progress: 5056 on 5890  Progress: 5057 on 5890  Progress: 5058 on 5890  Progress: 5059 on 5890  Progress: 5060 on 5890  Progress: 5061 on 5890  Progress: 5062 on 5890  Progress: 5063 on 5890  Progress: 5064 on 5890  Progress: 5065 on 5890  Progress: 5066 on 5890  Progress: 5067 on 5890  Progress: 5068 on 5890  Progress: 5069 on 5890  Progress: 5070 on 5890  Progress: 5071 on 5890  Progress: 5072 on 5890  Progress: 5073 on 5890  Progress: 5074 on 5890  Progress: 5075 on 5890  Progress: 5076 on 5890  Progress: 5077 on 5890  Progress: 5078 on 5890  Progress: 5079 on 5890  Progress: 5080 on 5890  Progress: 5081 on 5890  Progress: 5082 on 5890  Progress: 5083 on 5890  Progress: 5084 on 5890  Progress: 5085 on 5890  Progress: 5086 on 5890  Progress: 5087 on 5890  Progress: 5088 on 5890  Progress: 5089 on 5890  Progress: 5090 on 5890  Progress: 5091 on 5890  Progress: 5092 on 5890  Progress: 5093 on 5890  Progress: 5094 on 5890  Progress: 5095 on 5890  Progress: 5096 on 5890  Progress: 5097 on 5890  Progress: 5098 on 5890  Progress: 5099 on 5890  Progress: 5100 on 5890  Progress: 5101 on 5890  Progress: 5102 on 5890  Progress: 5103 on 5890  Progress: 5104 on 5890  Progress: 5105 on 5890  Progress: 5106 on 5890  Progress: 5107 on 5890  Progress: 5108 on 5890  Progress: 5109 on 5890  Progress: 5110 on 5890  Progress: 5111 on 5890  Progress: 5112 on 5890  Progress: 5113 on 5890  Progress: 5114 on 5890  Progress: 5115 on 5890  Progress: 5116 on 5890  Progress: 5117 on 5890  Progress: 5118 on 5890  Progress: 5119 on 5890  Progress: 5120 on 5890  Progress: 5121 on 5890  Progress: 5122 on 5890  Progress: 5123 on 5890  Progress: 5124 on 5890  Progress: 5125 on 5890  Progress: 5126 on 5890  Progress: 5127 on 5890  Progress: 5128 on 5890  Progress: 5129 on 5890  Progress: 5130 on 5890  Progress: 5131 on 5890  Progress: 5132 on 5890  Progress: 5133 on 5890  Progress: 5134 on 5890  Progress: 5135 on 5890  Progress: 5136 on 5890  Progress: 5137 on 5890  Progress: 5138 on 5890  Progress: 5139 on 5890  Progress: 5140 on 5890  Progress: 5141 on 5890  Progress: 5142 on 5890  Progress: 5143 on 5890  Progress: 5144 on 5890  Progress: 5145 on 5890  Progress: 5146 on 5890  Progress: 5147 on 5890  Progress: 5148 on 5890  Progress: 5149 on 5890  Progress: 5150 on 5890  Progress: 5151 on 5890  Progress: 5152 on 5890  Progress: 5153 on 5890  Progress: 5154 on 5890  Progress: 5155 on 5890  Progress: 5156 on 5890  Progress: 5157 on 5890  Progress: 5158 on 5890  Progress: 5159 on 5890  Progress: 5160 on 5890  Progress: 5161 on 5890  Progress: 5162 on 5890  Progress: 5163 on 5890  Progress: 5164 on 5890  Progress: 5165 on 5890  Progress: 5166 on 5890  Progress: 5167 on 5890  Progress: 5168 on 5890  Progress: 5169 on 5890  Progress: 5170 on 5890  Progress: 5171 on 5890  Progress: 5172 on 5890  Progress: 5173 on 5890  Progress: 5174 on 5890  Progress: 5175 on 5890  Progress: 5176 on 5890  Progress: 5177 on 5890  Progress: 5178 on 5890  Progress: 5179 on 5890  Progress: 5180 on 5890  Progress: 5181 on 5890  Progress: 5182 on 5890  Progress: 5183 on 5890  Progress: 5184 on 5890  Progress: 5185 on 5890  Progress: 5186 on 5890  Progress: 5187 on 5890  Progress: 5188 on 5890  Progress: 5189 on 5890  Progress: 5190 on 5890  Progress: 5191 on 5890  Progress: 5192 on 5890  Progress: 5193 on 5890  Progress: 5194 on 5890  Progress: 5195 on 5890  Progress: 5196 on 5890  Progress: 5197 on 5890  Progress: 5198 on 5890  Progress: 5199 on 5890  Progress: 5200 on 5890  Progress: 5201 on 5890  Progress: 5202 on 5890  Progress: 5203 on 5890  Progress: 5204 on 5890  Progress: 5205 on 5890  Progress: 5206 on 5890  Progress: 5207 on 5890  Progress: 5208 on 5890  Progress: 5209 on 5890  Progress: 5210 on 5890  Progress: 5211 on 5890  Progress: 5212 on 5890  Progress: 5213 on 5890  Progress: 5214 on 5890  Progress: 5215 on 5890  Progress: 5216 on 5890  Progress: 5217 on 5890  Progress: 5218 on 5890  Progress: 5219 on 5890  Progress: 5220 on 5890  Progress: 5221 on 5890  Progress: 5222 on 5890  Progress: 5223 on 5890  Progress: 5224 on 5890  Progress: 5225 on 5890  Progress: 5226 on 5890  Progress: 5227 on 5890  Progress: 5228 on 5890  Progress: 5229 on 5890  Progress: 5230 on 5890  Progress: 5231 on 5890  Progress: 5232 on 5890  Progress: 5233 on 5890  Progress: 5234 on 5890  Progress: 5235 on 5890  Progress: 5236 on 5890  Progress: 5237 on 5890  Progress: 5238 on 5890  Progress: 5239 on 5890  Progress: 5240 on 5890  Progress: 5241 on 5890  Progress: 5242 on 5890  Progress: 5243 on 5890  Progress: 5244 on 5890  Progress: 5245 on 5890  Progress: 5246 on 5890  Progress: 5247 on 5890  Progress: 5248 on 5890  Progress: 5249 on 5890  Progress: 5250 on 5890  Progress: 5251 on 5890  Progress: 5252 on 5890  Progress: 5253 on 5890  Progress: 5254 on 5890  Progress: 5255 on 5890  Progress: 5256 on 5890  Progress: 5257 on 5890  Progress: 5258 on 5890  Progress: 5259 on 5890  Progress: 5260 on 5890  Progress: 5261 on 5890  Progress: 5262 on 5890  Progress: 5263 on 5890  Progress: 5264 on 5890  Progress: 5265 on 5890  Progress: 5266 on 5890  Progress: 5267 on 5890  Progress: 5268 on 5890  Progress: 5269 on 5890  Progress: 5270 on 5890  Progress: 5271 on 5890  Progress: 5272 on 5890  Progress: 5273 on 5890  Progress: 5274 on 5890  Progress: 5275 on 5890  Progress: 5276 on 5890  Progress: 5277 on 5890  Progress: 5278 on 5890  Progress: 5279 on 5890  Progress: 5280 on 5890  Progress: 5281 on 5890  Progress: 5282 on 5890  Progress: 5283 on 5890  Progress: 5284 on 5890  Progress: 5285 on 5890  Progress: 5286 on 5890  Progress: 5287 on 5890  Progress: 5288 on 5890  Progress: 5289 on 5890  Progress: 5290 on 5890  Progress: 5291 on 5890  Progress: 5292 on 5890  Progress: 5293 on 5890  Progress: 5294 on 5890  Progress: 5295 on 5890  Progress: 5296 on 5890  Progress: 5297 on 5890  Progress: 5298 on 5890  Progress: 5299 on 5890  Progress: 5300 on 5890  Progress: 5301 on 5890  Progress: 5302 on 5890  Progress: 5303 on 5890  Progress: 5304 on 5890  Progress: 5305 on 5890  Progress: 5306 on 5890  Progress: 5307 on 5890  Progress: 5308 on 5890  Progress: 5309 on 5890  Progress: 5310 on 5890  Progress: 5311 on 5890  Progress: 5312 on 5890  Progress: 5313 on 5890  Progress: 5314 on 5890  Progress: 5315 on 5890  Progress: 5316 on 5890  Progress: 5317 on 5890  Progress: 5318 on 5890  Progress: 5319 on 5890  Progress: 5320 on 5890  Progress: 5321 on 5890  Progress: 5322 on 5890  Progress: 5323 on 5890  Progress: 5324 on 5890  Progress: 5325 on 5890  Progress: 5326 on 5890  Progress: 5327 on 5890  Progress: 5328 on 5890  Progress: 5329 on 5890  Progress: 5330 on 5890  Progress: 5331 on 5890  Progress: 5332 on 5890  Progress: 5333 on 5890  Progress: 5334 on 5890  Progress: 5335 on 5890  Progress: 5336 on 5890  Progress: 5337 on 5890  Progress: 5338 on 5890  Progress: 5339 on 5890  Progress: 5340 on 5890  Progress: 5341 on 5890  Progress: 5342 on 5890  Progress: 5343 on 5890  Progress: 5344 on 5890  Progress: 5345 on 5890  Progress: 5346 on 5890  Progress: 5347 on 5890  Progress: 5348 on 5890  Progress: 5349 on 5890  Progress: 5350 on 5890  Progress: 5351 on 5890  Progress: 5352 on 5890  Progress: 5353 on 5890  Progress: 5354 on 5890  Progress: 5355 on 5890  Progress: 5356 on 5890  Progress: 5357 on 5890  Progress: 5358 on 5890  Progress: 5359 on 5890  Progress: 5360 on 5890  Progress: 5361 on 5890  Progress: 5362 on 5890  Progress: 5363 on 5890  Progress: 5364 on 5890  Progress: 5365 on 5890  Progress: 5366 on 5890  Progress: 5367 on 5890  Progress: 5368 on 5890  Progress: 5369 on 5890  Progress: 5370 on 5890  Progress: 5371 on 5890  Progress: 5372 on 5890  Progress: 5373 on 5890  Progress: 5374 on 5890  Progress: 5375 on 5890  Progress: 5376 on 5890  Progress: 5377 on 5890  Progress: 5378 on 5890  Progress: 5379 on 5890  Progress: 5380 on 5890  Progress: 5381 on 5890  Progress: 5382 on 5890  Progress: 5383 on 5890  Progress: 5384 on 5890  Progress: 5385 on 5890  Progress: 5386 on 5890  Progress: 5387 on 5890  Progress: 5388 on 5890  Progress: 5389 on 5890  Progress: 5390 on 5890  Progress: 5391 on 5890  Progress: 5392 on 5890  Progress: 5393 on 5890  Progress: 5394 on 5890  Progress: 5395 on 5890  Progress: 5396 on 5890  Progress: 5397 on 5890  Progress: 5398 on 5890  Progress: 5399 on 5890  Progress: 5400 on 5890  Progress: 5401 on 5890  Progress: 5402 on 5890  Progress: 5403 on 5890  Progress: 5404 on 5890  Progress: 5405 on 5890  Progress: 5406 on 5890  Progress: 5407 on 5890  Progress: 5408 on 5890  Progress: 5409 on 5890  Progress: 5410 on 5890  Progress: 5411 on 5890  Progress: 5412 on 5890  Progress: 5413 on 5890  Progress: 5414 on 5890  Progress: 5415 on 5890  Progress: 5416 on 5890  Progress: 5417 on 5890  Progress: 5418 on 5890  Progress: 5419 on 5890  Progress: 5420 on 5890  Progress: 5421 on 5890  Progress: 5422 on 5890  Progress: 5423 on 5890  Progress: 5424 on 5890  Progress: 5425 on 5890  Progress: 5426 on 5890  Progress: 5427 on 5890  Progress: 5428 on 5890  Progress: 5429 on 5890  Progress: 5430 on 5890  Progress: 5431 on 5890  Progress: 5432 on 5890  Progress: 5433 on 5890  Progress: 5434 on 5890  Progress: 5435 on 5890  Progress: 5436 on 5890  Progress: 5437 on 5890  Progress: 5438 on 5890  Progress: 5439 on 5890  Progress: 5440 on 5890  Progress: 5441 on 5890  Progress: 5442 on 5890  Progress: 5443 on 5890  Progress: 5444 on 5890  Progress: 5445 on 5890  Progress: 5446 on 5890  Progress: 5447 on 5890  Progress: 5448 on 5890  Progress: 5449 on 5890  Progress: 5450 on 5890  Progress: 5451 on 5890  Progress: 5452 on 5890  Progress: 5453 on 5890  Progress: 5454 on 5890  Progress: 5455 on 5890  Progress: 5456 on 5890  Progress: 5457 on 5890  Progress: 5458 on 5890  Progress: 5459 on 5890  Progress: 5460 on 5890  Progress: 5461 on 5890  Progress: 5462 on 5890  Progress: 5463 on 5890  Progress: 5464 on 5890  Progress: 5465 on 5890  Progress: 5466 on 5890  Progress: 5467 on 5890  Progress: 5468 on 5890  Progress: 5469 on 5890  Progress: 5470 on 5890  Progress: 5471 on 5890  Progress: 5472 on 5890  Progress: 5473 on 5890  Progress: 5474 on 5890  Progress: 5475 on 5890  Progress: 5476 on 5890  Progress: 5477 on 5890  Progress: 5478 on 5890  Progress: 5479 on 5890  Progress: 5480 on 5890  Progress: 5481 on 5890  Progress: 5482 on 5890  Progress: 5483 on 5890  Progress: 5484 on 5890  Progress: 5485 on 5890  Progress: 5486 on 5890  Progress: 5487 on 5890  Progress: 5488 on 5890  Progress: 5489 on 5890  Progress: 5490 on 5890  Progress: 5491 on 5890  Progress: 5492 on 5890  Progress: 5493 on 5890  Progress: 5494 on 5890  Progress: 5495 on 5890  Progress: 5496 on 5890  Progress: 5497 on 5890  Progress: 5498 on 5890  Progress: 5499 on 5890  Progress: 5500 on 5890  Progress: 5501 on 5890  Progress: 5502 on 5890  Progress: 5503 on 5890  Progress: 5504 on 5890  Progress: 5505 on 5890  Progress: 5506 on 5890  Progress: 5507 on 5890  Progress: 5508 on 5890  Progress: 5509 on 5890  Progress: 5510 on 5890  Progress: 5511 on 5890  Progress: 5512 on 5890  Progress: 5513 on 5890  Progress: 5514 on 5890  Progress: 5515 on 5890  Progress: 5516 on 5890  Progress: 5517 on 5890  Progress: 5518 on 5890  Progress: 5519 on 5890  Progress: 5520 on 5890  Progress: 5521 on 5890  Progress: 5522 on 5890  Progress: 5523 on 5890  Progress: 5524 on 5890  Progress: 5525 on 5890  Progress: 5526 on 5890  Progress: 5527 on 5890  Progress: 5528 on 5890  Progress: 5529 on 5890  Progress: 5530 on 5890  Progress: 5531 on 5890  Progress: 5532 on 5890  Progress: 5533 on 5890  Progress: 5534 on 5890  Progress: 5535 on 5890  Progress: 5536 on 5890  Progress: 5537 on 5890  Progress: 5538 on 5890  Progress: 5539 on 5890  Progress: 5540 on 5890  Progress: 5541 on 5890  Progress: 5542 on 5890  Progress: 5543 on 5890  Progress: 5544 on 5890  Progress: 5545 on 5890  Progress: 5546 on 5890  Progress: 5547 on 5890  Progress: 5548 on 5890  Progress: 5549 on 5890  Progress: 5550 on 5890  Progress: 5551 on 5890  Progress: 5552 on 5890  Progress: 5553 on 5890  Progress: 5554 on 5890  Progress: 5555 on 5890  Progress: 5556 on 5890  Progress: 5557 on 5890  Progress: 5558 on 5890  Progress: 5559 on 5890  Progress: 5560 on 5890  Progress: 5561 on 5890  Progress: 5562 on 5890  Progress: 5563 on 5890  Progress: 5564 on 5890  Progress: 5565 on 5890  Progress: 5566 on 5890  Progress: 5567 on 5890  Progress: 5568 on 5890  Progress: 5569 on 5890  Progress: 5570 on 5890  Progress: 5571 on 5890  Progress: 5572 on 5890  Progress: 5573 on 5890  Progress: 5574 on 5890  Progress: 5575 on 5890  Progress: 5576 on 5890  Progress: 5577 on 5890  Progress: 5578 on 5890  Progress: 5579 on 5890  Progress: 5580 on 5890  Progress: 5581 on 5890  Progress: 5582 on 5890  Progress: 5583 on 5890  Progress: 5584 on 5890  Progress: 5585 on 5890  Progress: 5586 on 5890  Progress: 5587 on 5890  Progress: 5588 on 5890  Progress: 5589 on 5890  Progress: 5590 on 5890  Progress: 5591 on 5890  Progress: 5592 on 5890  Progress: 5593 on 5890  Progress: 5594 on 5890  Progress: 5595 on 5890  Progress: 5596 on 5890  Progress: 5597 on 5890  Progress: 5598 on 5890  Progress: 5599 on 5890  Progress: 5600 on 5890  Progress: 5601 on 5890  Progress: 5602 on 5890  Progress: 5603 on 5890  Progress: 5604 on 5890  Progress: 5605 on 5890  Progress: 5606 on 5890  Progress: 5607 on 5890  Progress: 5608 on 5890  Progress: 5609 on 5890  Progress: 5610 on 5890  Progress: 5611 on 5890  Progress: 5612 on 5890  Progress: 5613 on 5890  Progress: 5614 on 5890  Progress: 5615 on 5890  Progress: 5616 on 5890  Progress: 5617 on 5890  Progress: 5618 on 5890  Progress: 5619 on 5890  Progress: 5620 on 5890  Progress: 5621 on 5890  Progress: 5622 on 5890  Progress: 5623 on 5890  Progress: 5624 on 5890  Progress: 5625 on 5890  Progress: 5626 on 5890  Progress: 5627 on 5890  Progress: 5628 on 5890  Progress: 5629 on 5890  Progress: 5630 on 5890  Progress: 5631 on 5890  Progress: 5632 on 5890  Progress: 5633 on 5890  Progress: 5634 on 5890  Progress: 5635 on 5890  Progress: 5636 on 5890  Progress: 5637 on 5890  Progress: 5638 on 5890  Progress: 5639 on 5890  Progress: 5640 on 5890  Progress: 5641 on 5890  Progress: 5642 on 5890  Progress: 5643 on 5890  Progress: 5644 on 5890  Progress: 5645 on 5890  Progress: 5646 on 5890  Progress: 5647 on 5890  Progress: 5648 on 5890  Progress: 5649 on 5890  Progress: 5650 on 5890  Progress: 5651 on 5890  Progress: 5652 on 5890  Progress: 5653 on 5890  Progress: 5654 on 5890  Progress: 5655 on 5890  Progress: 5656 on 5890  Progress: 5657 on 5890  Progress: 5658 on 5890  Progress: 5659 on 5890  Progress: 5660 on 5890  Progress: 5661 on 5890  Progress: 5662 on 5890  Progress: 5663 on 5890  Progress: 5664 on 5890  Progress: 5665 on 5890  Progress: 5666 on 5890  Progress: 5667 on 5890  Progress: 5668 on 5890  Progress: 5669 on 5890  Progress: 5670 on 5890  Progress: 5671 on 5890  Progress: 5672 on 5890  Progress: 5673 on 5890  Progress: 5674 on 5890  Progress: 5675 on 5890  Progress: 5676 on 5890  Progress: 5677 on 5890  Progress: 5678 on 5890  Progress: 5679 on 5890  Progress: 5680 on 5890  Progress: 5681 on 5890  Progress: 5682 on 5890  Progress: 5683 on 5890  Progress: 5684 on 5890  Progress: 5685 on 5890  Progress: 5686 on 5890  Progress: 5687 on 5890  Progress: 5688 on 5890  Progress: 5689 on 5890  Progress: 5690 on 5890  Progress: 5691 on 5890  Progress: 5692 on 5890  Progress: 5693 on 5890  Progress: 5694 on 5890  Progress: 5695 on 5890  Progress: 5696 on 5890  Progress: 5697 on 5890  Progress: 5698 on 5890  Progress: 5699 on 5890  Progress: 5700 on 5890  Progress: 5701 on 5890  Progress: 5702 on 5890  Progress: 5703 on 5890  Progress: 5704 on 5890  Progress: 5705 on 5890  Progress: 5706 on 5890  Progress: 5707 on 5890  Progress: 5708 on 5890  Progress: 5709 on 5890  Progress: 5710 on 5890  Progress: 5711 on 5890  Progress: 5712 on 5890  Progress: 5713 on 5890  Progress: 5714 on 5890  Progress: 5715 on 5890  Progress: 5716 on 5890  Progress: 5717 on 5890  Progress: 5718 on 5890  Progress: 5719 on 5890  Progress: 5720 on 5890  Progress: 5721 on 5890  Progress: 5722 on 5890  Progress: 5723 on 5890  Progress: 5724 on 5890  Progress: 5725 on 5890  Progress: 5726 on 5890  Progress: 5727 on 5890  Progress: 5728 on 5890  Progress: 5729 on 5890  Progress: 5730 on 5890  Progress: 5731 on 5890  Progress: 5732 on 5890  Progress: 5733 on 5890  Progress: 5734 on 5890  Progress: 5735 on 5890  Progress: 5736 on 5890  Progress: 5737 on 5890  Progress: 5738 on 5890  Progress: 5739 on 5890  Progress: 5740 on 5890  Progress: 5741 on 5890  Progress: 5742 on 5890  Progress: 5743 on 5890  Progress: 5744 on 5890  Progress: 5745 on 5890  Progress: 5746 on 5890  Progress: 5747 on 5890  Progress: 5748 on 5890  Progress: 5749 on 5890  Progress: 5750 on 5890  Progress: 5751 on 5890  Progress: 5752 on 5890  Progress: 5753 on 5890  Progress: 5754 on 5890  Progress: 5755 on 5890  Progress: 5756 on 5890  Progress: 5757 on 5890  Progress: 5758 on 5890  Progress: 5759 on 5890  Progress: 5760 on 5890  Progress: 5761 on 5890  Progress: 5762 on 5890  Progress: 5763 on 5890  Progress: 5764 on 5890  Progress: 5765 on 5890  Progress: 5766 on 5890  Progress: 5767 on 5890  Progress: 5768 on 5890  Progress: 5769 on 5890  Progress: 5770 on 5890  Progress: 5771 on 5890  Progress: 5772 on 5890  Progress: 5773 on 5890  Progress: 5774 on 5890  Progress: 5775 on 5890  Progress: 5776 on 5890  Progress: 5777 on 5890  Progress: 5778 on 5890  Progress: 5779 on 5890  Progress: 5780 on 5890  Progress: 5781 on 5890  Progress: 5782 on 5890  Progress: 5783 on 5890  Progress: 5784 on 5890  Progress: 5785 on 5890  Progress: 5786 on 5890  Progress: 5787 on 5890  Progress: 5788 on 5890  Progress: 5789 on 5890  Progress: 5790 on 5890  Progress: 5791 on 5890  Progress: 5792 on 5890  Progress: 5793 on 5890  Progress: 5794 on 5890  Progress: 5795 on 5890  Progress: 5796 on 5890  Progress: 5797 on 5890  Progress: 5798 on 5890  Progress: 5799 on 5890  Progress: 5800 on 5890  Progress: 5801 on 5890  Progress: 5802 on 5890  Progress: 5803 on 5890  Progress: 5804 on 5890  Progress: 5805 on 5890  Progress: 5806 on 5890  Progress: 5807 on 5890  Progress: 5808 on 5890  Progress: 5809 on 5890  Progress: 5810 on 5890  Progress: 5811 on 5890  Progress: 5812 on 5890  Progress: 5813 on 5890  Progress: 5814 on 5890  Progress: 5815 on 5890  Progress: 5816 on 5890  Progress: 5817 on 5890  Progress: 5818 on 5890  Progress: 5819 on 5890  Progress: 5820 on 5890  Progress: 5821 on 5890  Progress: 5822 on 5890  Progress: 5823 on 5890  Progress: 5824 on 5890  Progress: 5825 on 5890  Progress: 5826 on 5890  Progress: 5827 on 5890  Progress: 5828 on 5890  Progress: 5829 on 5890  Progress: 5830 on 5890  Progress: 5831 on 5890  Progress: 5832 on 5890  Progress: 5833 on 5890  Progress: 5834 on 5890  Progress: 5835 on 5890  Progress: 5836 on 5890  Progress: 5837 on 5890  Progress: 5838 on 5890  Progress: 5839 on 5890  Progress: 5840 on 5890  Progress: 5841 on 5890  Progress: 5842 on 5890  Progress: 5843 on 5890  Progress: 5844 on 5890  Progress: 5845 on 5890  Progress: 5846 on 5890  Progress: 5847 on 5890  Progress: 5848 on 5890  Progress: 5849 on 5890  Progress: 5850 on 5890  Progress: 5851 on 5890  Progress: 5852 on 5890  Progress: 5853 on 5890  Progress: 5854 on 5890  Progress: 5855 on 5890  Progress: 5856 on 5890  Progress: 5857 on 5890  Progress: 5858 on 5890  Progress: 5859 on 5890  Progress: 5860 on 5890  Progress: 5861 on 5890  Progress: 5862 on 5890  Progress: 5863 on 5890  Progress: 5864 on 5890  Progress: 5865 on 5890  Progress: 5866 on 5890  Progress: 5867 on 5890  Progress: 5868 on 5890  Progress: 5869 on 5890  Progress: 5870 on 5890  Progress: 5871 on 5890  Progress: 5872 on 5890  Progress: 5873 on 5890  Progress: 5874 on 5890  Progress: 5875 on 5890  Progress: 5876 on 5890  Progress: 5877 on 5890  Progress: 5878 on 5890  Progress: 5879 on 5890  Progress: 5880 on 5890  Progress: 5881 on 5890  Progress: 5882 on 5890  Progress: 5883 on 5890  Progress: 5884 on 5890  Progress: 5885 on 5890  Progress: 5886 on 5890  Progress: 5887 on 5890  Progress: 5888 on 5890  Progress: 5889 on 5890  Progress: 5890 on 5890  
BN_wspoltworca <- BN_wspoltworca %>%
  mutate(ZA_ADNOTACJE = ifelse(czy_nazwisko==FALSE|czy_imie==FALSE,paste("UWAGA! Konflikt w danych osobowych w polach 700 i 245. Porównaj pola współtórców w formularzu z polem BN: ",X245c,sep = ""),NA)) %>%
  select(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,OS_OSOBA_ID,fo_symbol,fo_nazwa,funkcja,ZA_ADNOTACJE)

#7: opis współtwórców
opis_wspoltworcow <- BN_wspoltworca %>%
  select(ZA_UWAGI,funkcja,OS_IMIE,OS_NAZWISKO) %>%
  full_join(.,marc_field_245,by="ZA_UWAGI") %>%
  filter(!is.na(OS_NAZWISKO)|(is.na(OS_NAZWISKO)&grepl("et al\\.",X245c))) %>%
  mutate(jest_et_al = grepl("et al\\.",X245c),
         OS_IMIE = ifelse(OS_IMIE=="*","",as.character(OS_IMIE)),
         opis = ifelse(!is.na(OS_NAZWISKO),paste(funkcja,OS_IMIE, OS_NAZWISKO, sep = " "),""),
         opis = str_replace_all(opis," +"," "),
         opis = ifelse(opis==" ","",as.character(opis))) %>%
  select(ZA_UWAGI,opis,jest_et_al) %>%
  group_by(ZA_UWAGI) %>%
  mutate(opis = paste(opis,collapse = ", "),
         jest_et_al = paste(unique(jest_et_al),sep = "")) %>%
  ungroup() %>%
  unique() %>%
  mutate(opis = ifelse(jest_et_al==TRUE&opis=="","et al.",
                       ifelse(jest_et_al,paste(opis,"et al.",sep = " "),opis))) %>%
  select(ZA_UWAGI,opis)

#700
marc_field_700 <- data %>%
  select(ZA_UWAGI,X700)%>%
  filter(X700!="") %>%
  mutate(X700=str_replace_all(X700,"(..\\$a)","|\\1"),
         X700=str_replace_all(X700,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X700",sep = "~",direction = "long") %>%
  filter(X700!="") %>%
  mutate(X700=str_remove_all(X700,"^\\|")) %>%
  mutate(indicator = str_replace_all(X700,"(^.*?)(\\$.*)","\\1")) %>%
  filter(X700!="")
subfield_list<- str_extract_all(data$X700,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_700)[1]))
colnames(empty_table) <-subfield_list
marc_field_700<-cbind(marc_field_700,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_700$X700 <- str_replace(marc_field_700$X700,subfield_list_char[i],"|\\1")
}
Progress:  1 on 10  Progress:  2 on 10  Progress:  3 on 10  Progress:  4 on 10  Progress:  5 on 10  Progress:  6 on 10  Progress:  7 on 10  Progress:  8 on 10  Progress:  9 on 10  Progress: 10 on 10  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_700[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_700$X700),str_replace_all(gsub(string,"\\3",marc_field_700$X700),"\\${2}.", "~"),NA)
}
Progress:  1 on 10  Progress:  2 on 10  Progress:  3 on 10  Progress:  4 on 10  Progress:  5 on 10  Progress:  6 on 10  Progress:  7 on 10  Progress:  8 on 10  Progress:  9 on 10  Progress: 10 on 10  
marc_field_700 <- marc_field_700 %>%
  select(ZA_UWAGI,osoba = `$a`,funkcja = `$e`) %>%
  filter(!is.na(funkcja)) %>%
  mutate(osoba = str_remove(osoba,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)"),
         OS_NAZWISKO = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\1"),as.character(osoba)),
         OS_IMIE = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\3"),"*"),
         funkcja_duza = str_to_lower(funkcja),
         opis = paste(funkcja_duza,OS_IMIE,OS_NAZWISKO, sep = " "),
         opis_duzy = paste(funkcja,OS_IMIE,OS_NAZWISKO, sep = " ")) %>%
  select(ZA_UWAGI,opis,opis_duzy) %>%
  group_by(ZA_UWAGI) %>%
  mutate(opis = paste(opis,collapse = ". "),
         opis_duzy = paste(opis_duzy,collapse = ". ")) %>%
  ungroup() %>%
  unique()

#opis współtwórców ze strefy odpowiedzialności 245
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,`$c`)

#porównanie opisu współtwórców z 245 i 700
wspoltworcy <- marc_field_700 %>%
  full_join(.,marc_field_245,by="ZA_UWAGI") %>%
  cSplit(.,"$c",sep = " ; ",direction = "long") %>%
  #ograniczanie osób ze strefy odpowiedzialności
  mutate(czy_mala = grepl(" [a-zęóąśłżźćń]|^[a-zęóąśłżźćń]|\\[[a-zęóąśłżźćń]",`$c`,ignore.case = FALSE)) %>%
  filter(czy_mala==TRUE) %>%
  select(-czy_mala) %>%
  #mutate(`$c` = gsub("^(\\[){0,1}([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])","\\1\\U\\2",perl = TRUE,`$c`)) %>%
  group_by(ZA_UWAGI) %>%
  mutate(X245 = paste(`$c`, collapse = ", ")) %>%
  select(-`$c`) %>%
  unique() %>%
  mutate(order_pbl = as.character(str_extract_all(opis,"(?<=^| |\\[|-)([A-ZAÁÀÂÃÄĂĀÅĄÆEÉÈÊËĚĒĖĘIÍÌÎÏĪĮIOÓÒÔÕÖŐØŒUÚÙÛÜŰŪůYÝCĆČçDĎĐĐGĢĞKĶLŁĻNŃÑŇŅŊRŘSŚŠŞSßTŤŦÞŢ8ZŻŹŽa-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])")),
         order_pbl = str_replace_all(order_pbl,"(.*?\")(.)(\".*?.)", "\\2"),
         order_bn = as.character(str_extract_all(X245,"(?<=^| |\\[|-)([A-ZAÁÀÂÃÄĂĀÅĄÆEÉÈÊËĚĒĖĘIÍÌÎÏĪĮIOÓÒÔÕÖŐØŒUÚÙÛÜŰŪůYÝCĆČçDĎĐĐGĢĞKĶLŁĻNŃÑŇŅŊRŘSŚŠŞSßTŤŦÞŢ8ZŻŹŽa-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])")),
         order_bn = str_replace_all(order_bn,"(.*?\")(.)(\".*?.)", "\\2"),
         X245 = str_remove(X245, "\\.$"),
         X245 = str_remove(X245, "\\["),
         X245 = str_remove(X245, "\\]"),
         order_pbl = str_remove_all(order_pbl, "[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]"),
         order_bn = str_remove_all(order_bn, "[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]"),
         to_samo = order_pbl==order_bn,
         X245 = gsub("(^[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(.*)","\\U\\1\\E\\2",perl = TRUE, X245)) %>%
  left_join(.,za_jezyk_oryginalu,by="ZA_UWAGI") %>%
  mutate(czy_pl = grepl("pol",ZA_JEZYK_ORYGINALU)|is.na(ZA_JEZYK_ORYGINALU),
         decyzja = ifelse(to_samo==FALSE|czy_pl==FALSE,FALSE,TRUE))

za_opis_wspoltworcow <- wspoltworcy %>%
  mutate(za_opis_wspoltworcow = ifelse(decyzja==TRUE,as.character(X245),paste(X245,opis_duzy,sep = "#"))) %>%
  select(ZA_UWAGI,opis_duzy,za_opis_wspoltworcow) %>%
  cSplit(.,"za_opis_wspoltworcow",sep = "#",direction = "wide") %>%
  mutate(za_opis_wspoltworcow_2 = ifelse(is.na(za_opis_wspoltworcow_2),'',as.character(za_opis_wspoltworcow_2)),
         to_samo = za_opis_wspoltworcow_1==za_opis_wspoltworcow_2) %>%
  filter(to_samo==FALSE) %>%
  group_by(ZA_UWAGI) %>%
  mutate(za_opis_wspoltworcow = paste(za_opis_wspoltworcow_1,za_opis_wspoltworcow_2,sep = "#"),
         za_opis_wspoltworcow = str_remove_all(za_opis_wspoltworcow,"\\#$")) %>%
  select(ZA_UWAGI,za_opis_wspoltworcow)

opis_wspoltworcow <- opis_wspoltworcow %>%
  filter(ZA_UWAGI %notin% za_opis_wspoltworcow$ZA_UWAGI) %>%
  filter(!is.na(opis)) %>%
  rename(za_opis_wspoltworcow = opis)

za_opis_wspoltworcow <- za_opis_wspoltworcow %>%
  bind_rows(.,opis_wspoltworcow) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#8 wydanie
marc_field_250 <- data %>%
  select(ZA_UWAGI,X250)%>%
  filter(X250!="") %>%
  mutate(X250=str_replace_all(X250,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X250",sep = "~",direction = "long") %>%
  filter(X250!="") %>%
  mutate(X250=str_remove_all(X250,"^\\|")) %>%
  mutate(indicator = str_replace_all(X250,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X250,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_250)[1]))
colnames(empty_table) <-subfield_list
marc_field_250<-cbind(marc_field_250,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_250$X250 <- str_replace(marc_field_250$X250,subfield_list_char[i],"|\\1")
}
Progress: 1 on 2  Progress: 2 on 2  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_250[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_250$X250),str_replace_all(gsub(string,"\\3",marc_field_250$X250),"\\${2}.", "~"),NA)
}
Progress: 1 on 2  Progress: 2 on 2  
za_wydanie <- marc_field_250 %>%
  select(ZA_UWAGI, wydanie = `$a`) %>%
  mutate(wydanie = str_remove(wydanie," \\/$")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#9: instytucja sprawcza
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
za_instytucja <- marc_field_245 %>%
  select(ZA_UWAGI,X245c=`$c`) %>%
  filter(!is.na(X245c)) %>%
  mutate(instytucja = ifelse(grepl("\\;",X245c),str_replace_all(X245c, "(.*?)(\\;(?!.*\\;))( )+(.*?$)","\\4"),"")) %>%
  left_join(.,BN_wspoltworca,by="ZA_UWAGI")

x <- 1:lengths(za_instytucja[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  za_instytucja$czy_nazwisko[i] <- grepl(za_instytucja$OS_NAZWISKO[i],za_instytucja$X245c[i])
  za_instytucja$czy_imie[i] <- grepl(za_instytucja$OS_IMIE[i],za_instytucja$X245c[i])
}
Progress:    1 on 8876  Progress:    2 on 8876  Progress:    3 on 8876  Progress:    4 on 8876  Progress:    5 on 8876  Progress:    6 on 8876  Progress:    7 on 8876  Progress:    8 on 8876  Progress:    9 on 8876  Progress:   10 on 8876  Progress:   11 on 8876  Progress:   12 on 8876  Progress:   13 on 8876  Progress:   14 on 8876  Progress:   15 on 8876  Progress:   16 on 8876  Progress:   17 on 8876  Progress:   18 on 8876  Progress:   19 on 8876  Progress:   20 on 8876  Progress:   21 on 8876  Progress:   22 on 8876  Progress:   23 on 8876  Progress:   24 on 8876  Progress:   25 on 8876  Progress:   26 on 8876  Progress:   27 on 8876  Progress:   28 on 8876  Progress:   29 on 8876  Progress:   30 on 8876  Progress:   31 on 8876  Progress:   32 on 8876  Progress:   33 on 8876  Progress:   34 on 8876  Progress:   35 on 8876  Progress:   36 on 8876  Progress:   37 on 8876  Progress:   38 on 8876  Progress:   39 on 8876  Progress:   40 on 8876  Progress:   41 on 8876  Progress:   42 on 8876  Progress:   43 on 8876  Progress:   44 on 8876  Progress:   45 on 8876  Progress:   46 on 8876  Progress:   47 on 8876  Progress:   48 on 8876  Progress:   49 on 8876  Progress:   50 on 8876  Progress:   51 on 8876  Progress:   52 on 8876  Progress:   53 on 8876  Progress:   54 on 8876  Progress:   55 on 8876  Progress:   56 on 8876  Progress:   57 on 8876  Progress:   58 on 8876  Progress:   59 on 8876  Progress:   60 on 8876  Progress:   61 on 8876  Progress:   62 on 8876  Progress:   63 on 8876  Progress:   64 on 8876  Progress:   65 on 8876  Progress:   66 on 8876  Progress:   67 on 8876  Progress:   68 on 8876  Progress:   69 on 8876  Progress:   70 on 8876  Progress:   71 on 8876  Progress:   72 on 8876  Progress:   73 on 8876  Progress:   74 on 8876  Progress:   75 on 8876  Progress:   76 on 8876  Progress:   77 on 8876  Progress:   78 on 8876  Progress:   79 on 8876  Progress:   80 on 8876  Progress:   81 on 8876  Progress:   82 on 8876  Progress:   83 on 8876  Progress:   84 on 8876  Progress:   85 on 8876  Progress:   86 on 8876  Progress:   87 on 8876  Progress:   88 on 8876  Progress:   89 on 8876  Progress:   90 on 8876  Progress:   91 on 8876  Progress:   92 on 8876  Progress:   93 on 8876  Progress:   94 on 8876  Progress:   95 on 8876  Progress:   96 on 8876  Progress:   97 on 8876  Progress:   98 on 8876  Progress:   99 on 8876  Progress:  100 on 8876  Progress:  101 on 8876  Progress:  102 on 8876  Progress:  103 on 8876  Progress:  104 on 8876  Progress:  105 on 8876  Progress:  106 on 8876  Progress:  107 on 8876  Progress:  108 on 8876  Progress:  109 on 8876  Progress:  110 on 8876  Progress:  111 on 8876  Progress:  112 on 8876  Progress:  113 on 8876  Progress:  114 on 8876  Progress:  115 on 8876  Progress:  116 on 8876  Progress:  117 on 8876  Progress:  118 on 8876  Progress:  119 on 8876  Progress:  120 on 8876  Progress:  121 on 8876  Progress:  122 on 8876  Progress:  123 on 8876  Progress:  124 on 8876  Progress:  125 on 8876  Progress:  126 on 8876  Progress:  127 on 8876  Progress:  128 on 8876  Progress:  129 on 8876  Progress:  130 on 8876  Progress:  131 on 8876  Progress:  132 on 8876  Progress:  133 on 8876  Progress:  134 on 8876  Progress:  135 on 8876  Progress:  136 on 8876  Progress:  137 on 8876  Progress:  138 on 8876  Progress:  139 on 8876  Progress:  140 on 8876  Progress:  141 on 8876  Progress:  142 on 8876  Progress:  143 on 8876  Progress:  144 on 8876  Progress:  145 on 8876  Progress:  146 on 8876  Progress:  147 on 8876  Progress:  148 on 8876  Progress:  149 on 8876  Progress:  150 on 8876  Progress:  151 on 8876  Progress:  152 on 8876  Progress:  153 on 8876  Progress:  154 on 8876  Progress:  155 on 8876  Progress:  156 on 8876  Progress:  157 on 8876  Progress:  158 on 8876  Progress:  159 on 8876  Progress:  160 on 8876  Progress:  161 on 8876  Progress:  162 on 8876  Progress:  163 on 8876  Progress:  164 on 8876  Progress:  165 on 8876  Progress:  166 on 8876  Progress:  167 on 8876  Progress:  168 on 8876  Progress:  169 on 8876  Progress:  170 on 8876  Progress:  171 on 8876  Progress:  172 on 8876  Progress:  173 on 8876  Progress:  174 on 8876  Progress:  175 on 8876  Progress:  176 on 8876  Progress:  177 on 8876  Progress:  178 on 8876  Progress:  179 on 8876  Progress:  180 on 8876  Progress:  181 on 8876  Progress:  182 on 8876  Progress:  183 on 8876  Progress:  184 on 8876  Progress:  185 on 8876  Progress:  186 on 8876  Progress:  187 on 8876  Progress:  188 on 8876  Progress:  189 on 8876  Progress:  190 on 8876  Progress:  191 on 8876  Progress:  192 on 8876  Progress:  193 on 8876  Progress:  194 on 8876  Progress:  195 on 8876  Progress:  196 on 8876  Progress:  197 on 8876  Progress:  198 on 8876  Progress:  199 on 8876  Progress:  200 on 8876  Progress:  201 on 8876  Progress:  202 on 8876  Progress:  203 on 8876  Progress:  204 on 8876  Progress:  205 on 8876  Progress:  206 on 8876  Progress:  207 on 8876  Progress:  208 on 8876  Progress:  209 on 8876  Progress:  210 on 8876  Progress:  211 on 8876  Progress:  212 on 8876  Progress:  213 on 8876  Progress:  214 on 8876  Progress:  215 on 8876  Progress:  216 on 8876  Progress:  217 on 8876  Progress:  218 on 8876  Progress:  219 on 8876  Progress:  220 on 8876  Progress:  221 on 8876  Progress:  222 on 8876  Progress:  223 on 8876  Progress:  224 on 8876  Progress:  225 on 8876  Progress:  226 on 8876  Progress:  227 on 8876  Progress:  228 on 8876  Progress:  229 on 8876  Progress:  230 on 8876  Progress:  231 on 8876  Progress:  232 on 8876  Progress:  233 on 8876  Progress:  234 on 8876  Progress:  235 on 8876  Progress:  236 on 8876  Progress:  237 on 8876  Progress:  238 on 8876  Progress:  239 on 8876  Progress:  240 on 8876  Progress:  241 on 8876  Progress:  242 on 8876  Progress:  243 on 8876  Progress:  244 on 8876  Progress:  245 on 8876  Progress:  246 on 8876  Progress:  247 on 8876  Progress:  248 on 8876  Progress:  249 on 8876  Progress:  250 on 8876  Progress:  251 on 8876  Progress:  252 on 8876  Progress:  253 on 8876  Progress:  254 on 8876  Progress:  255 on 8876  Progress:  256 on 8876  Progress:  257 on 8876  Progress:  258 on 8876  Progress:  259 on 8876  Progress:  260 on 8876  Progress:  261 on 8876  Progress:  262 on 8876  Progress:  263 on 8876  Progress:  264 on 8876  Progress:  265 on 8876  Progress:  266 on 8876  Progress:  267 on 8876  Progress:  268 on 8876  Progress:  269 on 8876  Progress:  270 on 8876  Progress:  271 on 8876  Progress:  272 on 8876  Progress:  273 on 8876  Progress:  274 on 8876  Progress:  275 on 8876  Progress:  276 on 8876  Progress:  277 on 8876  Progress:  278 on 8876  Progress:  279 on 8876  Progress:  280 on 8876  Progress:  281 on 8876  Progress:  282 on 8876  Progress:  283 on 8876  Progress:  284 on 8876  Progress:  285 on 8876  Progress:  286 on 8876  Progress:  287 on 8876  Progress:  288 on 8876  Progress:  289 on 8876  Progress:  290 on 8876  Progress:  291 on 8876  Progress:  292 on 8876  Progress:  293 on 8876  Progress:  294 on 8876  Progress:  295 on 8876  Progress:  296 on 8876  Progress:  297 on 8876  Progress:  298 on 8876  Progress:  299 on 8876  Progress:  300 on 8876  Progress:  301 on 8876  Progress:  302 on 8876  Progress:  303 on 8876  Progress:  304 on 8876  Progress:  305 on 8876  Progress:  306 on 8876  Progress:  307 on 8876  Progress:  308 on 8876  Progress:  309 on 8876  Progress:  310 on 8876  Progress:  311 on 8876  Progress:  312 on 8876  Progress:  313 on 8876  Progress:  314 on 8876  Progress:  315 on 8876  Progress:  316 on 8876  Progress:  317 on 8876  Progress:  318 on 8876  Progress:  319 on 8876  Progress:  320 on 8876  Progress:  321 on 8876  Progress:  322 on 8876  Progress:  323 on 8876  Progress:  324 on 8876  Progress:  325 on 8876  Progress:  326 on 8876  Progress:  327 on 8876  Progress:  328 on 8876  Progress:  329 on 8876  Progress:  330 on 8876  Progress:  331 on 8876  Progress:  332 on 8876  Progress:  333 on 8876  Progress:  334 on 8876  Progress:  335 on 8876  Progress:  336 on 8876  Progress:  337 on 8876  Progress:  338 on 8876  Progress:  339 on 8876  Progress:  340 on 8876  Progress:  341 on 8876  Progress:  342 on 8876  Progress:  343 on 8876  Progress:  344 on 8876  Progress:  345 on 8876  Progress:  346 on 8876  Progress:  347 on 8876  Progress:  348 on 8876  Progress:  349 on 8876  Progress:  350 on 8876  Progress:  351 on 8876  Progress:  352 on 8876  Progress:  353 on 8876  Progress:  354 on 8876  Progress:  355 on 8876  Progress:  356 on 8876  Progress:  357 on 8876  Progress:  358 on 8876  Progress:  359 on 8876  Progress:  360 on 8876  Progress:  361 on 8876  Progress:  362 on 8876  Progress:  363 on 8876  Progress:  364 on 8876  Progress:  365 on 8876  Progress:  366 on 8876  Progress:  367 on 8876  Progress:  368 on 8876  Progress:  369 on 8876  Progress:  370 on 8876  Progress:  371 on 8876  Progress:  372 on 8876  Progress:  373 on 8876  Progress:  374 on 8876  Progress:  375 on 8876  Progress:  376 on 8876  Progress:  377 on 8876  Progress:  378 on 8876  Progress:  379 on 8876  Progress:  380 on 8876  Progress:  381 on 8876  Progress:  382 on 8876  Progress:  383 on 8876  Progress:  384 on 8876  Progress:  385 on 8876  Progress:  386 on 8876  Progress:  387 on 8876  Progress:  388 on 8876  Progress:  389 on 8876  Progress:  390 on 8876  Progress:  391 on 8876  Progress:  392 on 8876  Progress:  393 on 8876  Progress:  394 on 8876  Progress:  395 on 8876  Progress:  396 on 8876  Progress:  397 on 8876  Progress:  398 on 8876  Progress:  399 on 8876  Progress:  400 on 8876  Progress:  401 on 8876  Progress:  402 on 8876  Progress:  403 on 8876  Progress:  404 on 8876  Progress:  405 on 8876  Progress:  406 on 8876  Progress:  407 on 8876  Progress:  408 on 8876  Progress:  409 on 8876  Progress:  410 on 8876  Progress:  411 on 8876  Progress:  412 on 8876  Progress:  413 on 8876  Progress:  414 on 8876  Progress:  415 on 8876  Progress:  416 on 8876  Progress:  417 on 8876  Progress:  418 on 8876  Progress:  419 on 8876  Progress:  420 on 8876  Progress:  421 on 8876  Progress:  422 on 8876  Progress:  423 on 8876  Progress:  424 on 8876  Progress:  425 on 8876  Progress:  426 on 8876  Progress:  427 on 8876  Progress:  428 on 8876  Progress:  429 on 8876  Progress:  430 on 8876  Progress:  431 on 8876  Progress:  432 on 8876  Progress:  433 on 8876  Progress:  434 on 8876  Progress:  435 on 8876  Progress:  436 on 8876  Progress:  437 on 8876  Progress:  438 on 8876  Progress:  439 on 8876  Progress:  440 on 8876  Progress:  441 on 8876  Progress:  442 on 8876  Progress:  443 on 8876  Progress:  444 on 8876  Progress:  445 on 8876  Progress:  446 on 8876  Progress:  447 on 8876  Progress:  448 on 8876  Progress:  449 on 8876  Progress:  450 on 8876  Progress:  451 on 8876  Progress:  452 on 8876  Progress:  453 on 8876  Progress:  454 on 8876  Progress:  455 on 8876  Progress:  456 on 8876  Progress:  457 on 8876  Progress:  458 on 8876  Progress:  459 on 8876  Progress:  460 on 8876  Progress:  461 on 8876  Progress:  462 on 8876  Progress:  463 on 8876  Progress:  464 on 8876  Progress:  465 on 8876  Progress:  466 on 8876  Progress:  467 on 8876  Progress:  468 on 8876  Progress:  469 on 8876  Progress:  470 on 8876  Progress:  471 on 8876  Progress:  472 on 8876  Progress:  473 on 8876  Progress:  474 on 8876  Progress:  475 on 8876  Progress:  476 on 8876  Progress:  477 on 8876  Progress:  478 on 8876  Progress:  479 on 8876  Progress:  480 on 8876  Progress:  481 on 8876  Progress:  482 on 8876  Progress:  483 on 8876  Progress:  484 on 8876  Progress:  485 on 8876  Progress:  486 on 8876  Progress:  487 on 8876  Progress:  488 on 8876  Progress:  489 on 8876  Progress:  490 on 8876  Progress:  491 on 8876  Progress:  492 on 8876  Progress:  493 on 8876  Progress:  494 on 8876  Progress:  495 on 8876  Progress:  496 on 8876  Progress:  497 on 8876  Progress:  498 on 8876  Progress:  499 on 8876  Progress:  500 on 8876  Progress:  501 on 8876  Progress:  502 on 8876  Progress:  503 on 8876  Progress:  504 on 8876  Progress:  505 on 8876  Progress:  506 on 8876  Progress:  507 on 8876  Progress:  508 on 8876  Progress:  509 on 8876  Progress:  510 on 8876  Progress:  511 on 8876  Progress:  512 on 8876  Progress:  513 on 8876  Progress:  514 on 8876  Progress:  515 on 8876  Progress:  516 on 8876  Progress:  517 on 8876  Progress:  518 on 8876  Progress:  519 on 8876  Progress:  520 on 8876  Progress:  521 on 8876  Progress:  522 on 8876  Progress:  523 on 8876  Progress:  524 on 8876  Progress:  525 on 8876  Progress:  526 on 8876  Progress:  527 on 8876  Progress:  528 on 8876  Progress:  529 on 8876  Progress:  530 on 8876  Progress:  531 on 8876  Progress:  532 on 8876  Progress:  533 on 8876  Progress:  534 on 8876  Progress:  535 on 8876  Progress:  536 on 8876  Progress:  537 on 8876  Progress:  538 on 8876  Progress:  539 on 8876  Progress:  540 on 8876  Progress:  541 on 8876  Progress:  542 on 8876  Progress:  543 on 8876  Progress:  544 on 8876  Progress:  545 on 8876  Progress:  546 on 8876  Progress:  547 on 8876  Progress:  548 on 8876  Progress:  549 on 8876  Progress:  550 on 8876  Progress:  551 on 8876  Progress:  552 on 8876  Progress:  553 on 8876  Progress:  554 on 8876  Progress:  555 on 8876  Progress:  556 on 8876  Progress:  557 on 8876  Progress:  558 on 8876  Progress:  559 on 8876  Progress:  560 on 8876  Progress:  561 on 8876  Progress:  562 on 8876  Progress:  563 on 8876  Progress:  564 on 8876  Progress:  565 on 8876  Progress:  566 on 8876  Progress:  567 on 8876  Progress:  568 on 8876  Progress:  569 on 8876  Progress:  570 on 8876  Progress:  571 on 8876  Progress:  572 on 8876  Progress:  573 on 8876  Progress:  574 on 8876  Progress:  575 on 8876  Progress:  576 on 8876  Progress:  577 on 8876  Progress:  578 on 8876  Progress:  579 on 8876  Progress:  580 on 8876  Progress:  581 on 8876  Progress:  582 on 8876  Progress:  583 on 8876  Progress:  584 on 8876  Progress:  585 on 8876  Progress:  586 on 8876  Progress:  587 on 8876  Progress:  588 on 8876  Progress:  589 on 8876  Progress:  590 on 8876  Progress:  591 on 8876  Progress:  592 on 8876  Progress:  593 on 8876  Progress:  594 on 8876  Progress:  595 on 8876  Progress:  596 on 8876  Progress:  597 on 8876  Progress:  598 on 8876  Progress:  599 on 8876  Progress:  600 on 8876  Progress:  601 on 8876  Progress:  602 on 8876  Progress:  603 on 8876  Progress:  604 on 8876  Progress:  605 on 8876  Progress:  606 on 8876  Progress:  607 on 8876  Progress:  608 on 8876  Progress:  609 on 8876  Progress:  610 on 8876  Progress:  611 on 8876  Progress:  612 on 8876  Progress:  613 on 8876  Progress:  614 on 8876  Progress:  615 on 8876  Progress:  616 on 8876  Progress:  617 on 8876  Progress:  618 on 8876  Progress:  619 on 8876  Progress:  620 on 8876  Progress:  621 on 8876  Progress:  622 on 8876  Progress:  623 on 8876  Progress:  624 on 8876  Progress:  625 on 8876  Progress:  626 on 8876  Progress:  627 on 8876  Progress:  628 on 8876  Progress:  629 on 8876  Progress:  630 on 8876  Progress:  631 on 8876  Progress:  632 on 8876  Progress:  633 on 8876  Progress:  634 on 8876  Progress:  635 on 8876  Progress:  636 on 8876  Progress:  637 on 8876  Progress:  638 on 8876  Progress:  639 on 8876  Progress:  640 on 8876  Progress:  641 on 8876  Progress:  642 on 8876  Progress:  643 on 8876  Progress:  644 on 8876  Progress:  645 on 8876  Progress:  646 on 8876  Progress:  647 on 8876  Progress:  648 on 8876  Progress:  649 on 8876  Progress:  650 on 8876  Progress:  651 on 8876  Progress:  652 on 8876  Progress:  653 on 8876  Progress:  654 on 8876  Progress:  655 on 8876  Progress:  656 on 8876  Progress:  657 on 8876  Progress:  658 on 8876  Progress:  659 on 8876  Progress:  660 on 8876  Progress:  661 on 8876  Progress:  662 on 8876  Progress:  663 on 8876  Progress:  664 on 8876  Progress:  665 on 8876  Progress:  666 on 8876  Progress:  667 on 8876  Progress:  668 on 8876  Progress:  669 on 8876  Progress:  670 on 8876  Progress:  671 on 8876  Progress:  672 on 8876  Progress:  673 on 8876  Progress:  674 on 8876  Progress:  675 on 8876  Progress:  676 on 8876  Progress:  677 on 8876  Progress:  678 on 8876  Progress:  679 on 8876  Progress:  680 on 8876  Progress:  681 on 8876  Progress:  682 on 8876  Progress:  683 on 8876  Progress:  684 on 8876  Progress:  685 on 8876  Progress:  686 on 8876  Progress:  687 on 8876  Progress:  688 on 8876  Progress:  689 on 8876  Progress:  690 on 8876  Progress:  691 on 8876  Progress:  692 on 8876  Progress:  693 on 8876  Progress:  694 on 8876  Progress:  695 on 8876  Progress:  696 on 8876  Progress:  697 on 8876  Progress:  698 on 8876  Progress:  699 on 8876  Progress:  700 on 8876  Progress:  701 on 8876  Progress:  702 on 8876  Progress:  703 on 8876  Progress:  704 on 8876  Progress:  705 on 8876  Progress:  706 on 8876  Progress:  707 on 8876  Progress:  708 on 8876  Progress:  709 on 8876  Progress:  710 on 8876  Progress:  711 on 8876  Progress:  712 on 8876  Progress:  713 on 8876  Progress:  714 on 8876  Progress:  715 on 8876  Progress:  716 on 8876  Progress:  717 on 8876  Progress:  718 on 8876  Progress:  719 on 8876  Progress:  720 on 8876  Progress:  721 on 8876  Progress:  722 on 8876  Progress:  723 on 8876  Progress:  724 on 8876  Progress:  725 on 8876  Progress:  726 on 8876  Progress:  727 on 8876  Progress:  728 on 8876  Progress:  729 on 8876  Progress:  730 on 8876  Progress:  731 on 8876  Progress:  732 on 8876  Progress:  733 on 8876  Progress:  734 on 8876  Progress:  735 on 8876  Progress:  736 on 8876  Progress:  737 on 8876  Progress:  738 on 8876  Progress:  739 on 8876  Progress:  740 on 8876  Progress:  741 on 8876  Progress:  742 on 8876  Progress:  743 on 8876  Progress:  744 on 8876  Progress:  745 on 8876  Progress:  746 on 8876  Progress:  747 on 8876  Progress:  748 on 8876  Progress:  749 on 8876  Progress:  750 on 8876  Progress:  751 on 8876  Progress:  752 on 8876  Progress:  753 on 8876  Progress:  754 on 8876  Progress:  755 on 8876  Progress:  756 on 8876  Progress:  757 on 8876  Progress:  758 on 8876  Progress:  759 on 8876  Progress:  760 on 8876  Progress:  761 on 8876  Progress:  762 on 8876  Progress:  763 on 8876  Progress:  764 on 8876  Progress:  765 on 8876  Progress:  766 on 8876  Progress:  767 on 8876  Progress:  768 on 8876  Progress:  769 on 8876  Progress:  770 on 8876  Progress:  771 on 8876  Progress:  772 on 8876  Progress:  773 on 8876  Progress:  774 on 8876  Progress:  775 on 8876  Progress:  776 on 8876  Progress:  777 on 8876  Progress:  778 on 8876  Progress:  779 on 8876  Progress:  780 on 8876  Progress:  781 on 8876  Progress:  782 on 8876  Progress:  783 on 8876  Progress:  784 on 8876  Progress:  785 on 8876  Progress:  786 on 8876  Progress:  787 on 8876  Progress:  788 on 8876  Progress:  789 on 8876  Progress:  790 on 8876  Progress:  791 on 8876  Progress:  792 on 8876  Progress:  793 on 8876  Progress:  794 on 8876  Progress:  795 on 8876  Progress:  796 on 8876  Progress:  797 on 8876  Progress:  798 on 8876  Progress:  799 on 8876  Progress:  800 on 8876  Progress:  801 on 8876  Progress:  802 on 8876  Progress:  803 on 8876  Progress:  804 on 8876  Progress:  805 on 8876  Progress:  806 on 8876  Progress:  807 on 8876  Progress:  808 on 8876  Progress:  809 on 8876  Progress:  810 on 8876  Progress:  811 on 8876  Progress:  812 on 8876  Progress:  813 on 8876  Progress:  814 on 8876  Progress:  815 on 8876  Progress:  816 on 8876  Progress:  817 on 8876  Progress:  818 on 8876  Progress:  819 on 8876  Progress:  820 on 8876  Progress:  821 on 8876  Progress:  822 on 8876  Progress:  823 on 8876  Progress:  824 on 8876  Progress:  825 on 8876  Progress:  826 on 8876  Progress:  827 on 8876  Progress:  828 on 8876  Progress:  829 on 8876  Progress:  830 on 8876  Progress:  831 on 8876  Progress:  832 on 8876  Progress:  833 on 8876  Progress:  834 on 8876  Progress:  835 on 8876  Progress:  836 on 8876  Progress:  837 on 8876  Progress:  838 on 8876  Progress:  839 on 8876  Progress:  840 on 8876  Progress:  841 on 8876  Progress:  842 on 8876  Progress:  843 on 8876  Progress:  844 on 8876  Progress:  845 on 8876  Progress:  846 on 8876  Progress:  847 on 8876  Progress:  848 on 8876  Progress:  849 on 8876  Progress:  850 on 8876  Progress:  851 on 8876  Progress:  852 on 8876  Progress:  853 on 8876  Progress:  854 on 8876  Progress:  855 on 8876  Progress:  856 on 8876  Progress:  857 on 8876  Progress:  858 on 8876  Progress:  859 on 8876  Progress:  860 on 8876  Progress:  861 on 8876  Progress:  862 on 8876  Progress:  863 on 8876  Progress:  864 on 8876  Progress:  865 on 8876  Progress:  866 on 8876  Progress:  867 on 8876  Progress:  868 on 8876  Progress:  869 on 8876  Progress:  870 on 8876  Progress:  871 on 8876  Progress:  872 on 8876  Progress:  873 on 8876  Progress:  874 on 8876  Progress:  875 on 8876  Progress:  876 on 8876  Progress:  877 on 8876  Progress:  878 on 8876  Progress:  879 on 8876  Progress:  880 on 8876  Progress:  881 on 8876  Progress:  882 on 8876  Progress:  883 on 8876  Progress:  884 on 8876  Progress:  885 on 8876  Progress:  886 on 8876  Progress:  887 on 8876  Progress:  888 on 8876  Progress:  889 on 8876  Progress:  890 on 8876  Progress:  891 on 8876  Progress:  892 on 8876  Progress:  893 on 8876  Progress:  894 on 8876  Progress:  895 on 8876  Progress:  896 on 8876  Progress:  897 on 8876  Progress:  898 on 8876  Progress:  899 on 8876  Progress:  900 on 8876  Progress:  901 on 8876  Progress:  902 on 8876  Progress:  903 on 8876  Progress:  904 on 8876  Progress:  905 on 8876  Progress:  906 on 8876  Progress:  907 on 8876  Progress:  908 on 8876  Progress:  909 on 8876  Progress:  910 on 8876  Progress:  911 on 8876  Progress:  912 on 8876  Progress:  913 on 8876  Progress:  914 on 8876  Progress:  915 on 8876  Progress:  916 on 8876  Progress:  917 on 8876  Progress:  918 on 8876  Progress:  919 on 8876  Progress:  920 on 8876  Progress:  921 on 8876  Progress:  922 on 8876  Progress:  923 on 8876  Progress:  924 on 8876  Progress:  925 on 8876  Progress:  926 on 8876  Progress:  927 on 8876  Progress:  928 on 8876  Progress:  929 on 8876  Progress:  930 on 8876  Progress:  931 on 8876  Progress:  932 on 8876  Progress:  933 on 8876  Progress:  934 on 8876  Progress:  935 on 8876  Progress:  936 on 8876  Progress:  937 on 8876  Progress:  938 on 8876  Progress:  939 on 8876  Progress:  940 on 8876  Progress:  941 on 8876  Progress:  942 on 8876  Progress:  943 on 8876  Progress:  944 on 8876  Progress:  945 on 8876  Progress:  946 on 8876  Progress:  947 on 8876  Progress:  948 on 8876  Progress:  949 on 8876  Progress:  950 on 8876  Progress:  951 on 8876  Progress:  952 on 8876  Progress:  953 on 8876  Progress:  954 on 8876  Progress:  955 on 8876  Progress:  956 on 8876  Progress:  957 on 8876  Progress:  958 on 8876  Progress:  959 on 8876  Progress:  960 on 8876  Progress:  961 on 8876  Progress:  962 on 8876  Progress:  963 on 8876  Progress:  964 on 8876  Progress:  965 on 8876  Progress:  966 on 8876  Progress:  967 on 8876  Progress:  968 on 8876  Progress:  969 on 8876  Progress:  970 on 8876  Progress:  971 on 8876  Progress:  972 on 8876  Progress:  973 on 8876  Progress:  974 on 8876  Progress:  975 on 8876  Progress:  976 on 8876  Progress:  977 on 8876  Progress:  978 on 8876  Progress:  979 on 8876  Progress:  980 on 8876  Progress:  981 on 8876  Progress:  982 on 8876  Progress:  983 on 8876  Progress:  984 on 8876  Progress:  985 on 8876  Progress:  986 on 8876  Progress:  987 on 8876  Progress:  988 on 8876  Progress:  989 on 8876  Progress:  990 on 8876  Progress:  991 on 8876  Progress:  992 on 8876  Progress:  993 on 8876  Progress:  994 on 8876  Progress:  995 on 8876  Progress:  996 on 8876  Progress:  997 on 8876  Progress:  998 on 8876  Progress:  999 on 8876  Progress: 1000 on 8876  Progress: 1001 on 8876  Progress: 1002 on 8876  Progress: 1003 on 8876  Progress: 1004 on 8876  Progress: 1005 on 8876  Progress: 1006 on 8876  Progress: 1007 on 8876  Progress: 1008 on 8876  Progress: 1009 on 8876  Progress: 1010 on 8876  Progress: 1011 on 8876  Progress: 1012 on 8876  Progress: 1013 on 8876  Progress: 1014 on 8876  Progress: 1015 on 8876  Progress: 1016 on 8876  Progress: 1017 on 8876  Progress: 1018 on 8876  Progress: 1019 on 8876  Progress: 1020 on 8876  Progress: 1021 on 8876  Progress: 1022 on 8876  Progress: 1023 on 8876  Progress: 1024 on 8876  Progress: 1025 on 8876  Progress: 1026 on 8876  Progress: 1027 on 8876  Progress: 1028 on 8876  Progress: 1029 on 8876  Progress: 1030 on 8876  Progress: 1031 on 8876  Progress: 1032 on 8876  Progress: 1033 on 8876  Progress: 1034 on 8876  Progress: 1035 on 8876  Progress: 1036 on 8876  Progress: 1037 on 8876  Progress: 1038 on 8876  Progress: 1039 on 8876  Progress: 1040 on 8876  Progress: 1041 on 8876  Progress: 1042 on 8876  Progress: 1043 on 8876  Progress: 1044 on 8876  Progress: 1045 on 8876  Progress: 1046 on 8876  Progress: 1047 on 8876  Progress: 1048 on 8876  Progress: 1049 on 8876  Progress: 1050 on 8876  Progress: 1051 on 8876  Progress: 1052 on 8876  Progress: 1053 on 8876  Progress: 1054 on 8876  Progress: 1055 on 8876  Progress: 1056 on 8876  Progress: 1057 on 8876  Progress: 1058 on 8876  Progress: 1059 on 8876  Progress: 1060 on 8876  Progress: 1061 on 8876  Progress: 1062 on 8876  Progress: 1063 on 8876  Progress: 1064 on 8876  Progress: 1065 on 8876  Progress: 1066 on 8876  Progress: 1067 on 8876  Progress: 1068 on 8876  Progress: 1069 on 8876  Progress: 1070 on 8876  Progress: 1071 on 8876  Progress: 1072 on 8876  Progress: 1073 on 8876  Progress: 1074 on 8876  Progress: 1075 on 8876  Progress: 1076 on 8876  Progress: 1077 on 8876  Progress: 1078 on 8876  Progress: 1079 on 8876  Progress: 1080 on 8876  Progress: 1081 on 8876  Progress: 1082 on 8876  Progress: 1083 on 8876  Progress: 1084 on 8876  Progress: 1085 on 8876  Progress: 1086 on 8876  Progress: 1087 on 8876  Progress: 1088 on 8876  Progress: 1089 on 8876  Progress: 1090 on 8876  Progress: 1091 on 8876  Progress: 1092 on 8876  Progress: 1093 on 8876  Progress: 1094 on 8876  Progress: 1095 on 8876  Progress: 1096 on 8876  Progress: 1097 on 8876  Progress: 1098 on 8876  Progress: 1099 on 8876  Progress: 1100 on 8876  Progress: 1101 on 8876  Progress: 1102 on 8876  Progress: 1103 on 8876  Progress: 1104 on 8876  Progress: 1105 on 8876  Progress: 1106 on 8876  Progress: 1107 on 8876  Progress: 1108 on 8876  Progress: 1109 on 8876  Progress: 1110 on 8876  Progress: 1111 on 8876  Progress: 1112 on 8876  Progress: 1113 on 8876  Progress: 1114 on 8876  Progress: 1115 on 8876  Progress: 1116 on 8876  Progress: 1117 on 8876  Progress: 1118 on 8876  Progress: 1119 on 8876  Progress: 1120 on 8876  Progress: 1121 on 8876  Progress: 1122 on 8876  Progress: 1123 on 8876  Progress: 1124 on 8876  Progress: 1125 on 8876  Progress: 1126 on 8876  Progress: 1127 on 8876  Progress: 1128 on 8876  Progress: 1129 on 8876  Progress: 1130 on 8876  Progress: 1131 on 8876  Progress: 1132 on 8876  Progress: 1133 on 8876  Progress: 1134 on 8876  Progress: 1135 on 8876  Progress: 1136 on 8876  Progress: 1137 on 8876  Progress: 1138 on 8876  Progress: 1139 on 8876  Progress: 1140 on 8876  Progress: 1141 on 8876  Progress: 1142 on 8876  Progress: 1143 on 8876  Progress: 1144 on 8876  Progress: 1145 on 8876  Progress: 1146 on 8876  Progress: 1147 on 8876  Progress: 1148 on 8876  Progress: 1149 on 8876  Progress: 1150 on 8876  Progress: 1151 on 8876  Progress: 1152 on 8876  Progress: 1153 on 8876  Progress: 1154 on 8876  Progress: 1155 on 8876  Progress: 1156 on 8876  Progress: 1157 on 8876  Progress: 1158 on 8876  Progress: 1159 on 8876  Progress: 1160 on 8876  Progress: 1161 on 8876  Progress: 1162 on 8876  Progress: 1163 on 8876  Progress: 1164 on 8876  Progress: 1165 on 8876  Progress: 1166 on 8876  Progress: 1167 on 8876  Progress: 1168 on 8876  Progress: 1169 on 8876  Progress: 1170 on 8876  Progress: 1171 on 8876  Progress: 1172 on 8876  Progress: 1173 on 8876  Progress: 1174 on 8876  Progress: 1175 on 8876  Progress: 1176 on 8876  Progress: 1177 on 8876  Progress: 1178 on 8876  Progress: 1179 on 8876  Progress: 1180 on 8876  Progress: 1181 on 8876  Progress: 1182 on 8876  Progress: 1183 on 8876  Progress: 1184 on 8876  Progress: 1185 on 8876  Progress: 1186 on 8876  Progress: 1187 on 8876  Progress: 1188 on 8876  Progress: 1189 on 8876  Progress: 1190 on 8876  Progress: 1191 on 8876  Progress: 1192 on 8876  Progress: 1193 on 8876  Progress: 1194 on 8876  Progress: 1195 on 8876  Progress: 1196 on 8876  Progress: 1197 on 8876  Progress: 1198 on 8876  Progress: 1199 on 8876  Progress: 1200 on 8876  Progress: 1201 on 8876  Progress: 1202 on 8876  Progress: 1203 on 8876  Progress: 1204 on 8876  Progress: 1205 on 8876  Progress: 1206 on 8876  Progress: 1207 on 8876  Progress: 1208 on 8876  Progress: 1209 on 8876  Progress: 1210 on 8876  Progress: 1211 on 8876  Progress: 1212 on 8876  Progress: 1213 on 8876  Progress: 1214 on 8876  Progress: 1215 on 8876  Progress: 1216 on 8876  Progress: 1217 on 8876  Progress: 1218 on 8876  Progress: 1219 on 8876  Progress: 1220 on 8876  Progress: 1221 on 8876  Progress: 1222 on 8876  Progress: 1223 on 8876  Progress: 1224 on 8876  Progress: 1225 on 8876  Progress: 1226 on 8876  Progress: 1227 on 8876  Progress: 1228 on 8876  Progress: 1229 on 8876  Progress: 1230 on 8876  Progress: 1231 on 8876  Progress: 1232 on 8876  Progress: 1233 on 8876  Progress: 1234 on 8876  Progress: 1235 on 8876  Progress: 1236 on 8876  Progress: 1237 on 8876  Progress: 1238 on 8876  Progress: 1239 on 8876  Progress: 1240 on 8876  Progress: 1241 on 8876  Progress: 1242 on 8876  Progress: 1243 on 8876  Progress: 1244 on 8876  Progress: 1245 on 8876  Progress: 1246 on 8876  Progress: 1247 on 8876  Progress: 1248 on 8876  Progress: 1249 on 8876  Progress: 1250 on 8876  Progress: 1251 on 8876  Progress: 1252 on 8876  Progress: 1253 on 8876  Progress: 1254 on 8876  Progress: 1255 on 8876  Progress: 1256 on 8876  Progress: 1257 on 8876  Progress: 1258 on 8876  Progress: 1259 on 8876  Progress: 1260 on 8876  Progress: 1261 on 8876  Progress: 1262 on 8876  Progress: 1263 on 8876  Progress: 1264 on 8876  Progress: 1265 on 8876  Progress: 1266 on 8876  Progress: 1267 on 8876  Progress: 1268 on 8876  Progress: 1269 on 8876  Progress: 1270 on 8876  Progress: 1271 on 8876  Progress: 1272 on 8876  Progress: 1273 on 8876  Progress: 1274 on 8876  Progress: 1275 on 8876  Progress: 1276 on 8876  Progress: 1277 on 8876  Progress: 1278 on 8876  Progress: 1279 on 8876  Progress: 1280 on 8876  Progress: 1281 on 8876  Progress: 1282 on 8876  Progress: 1283 on 8876  Progress: 1284 on 8876  Progress: 1285 on 8876  Progress: 1286 on 8876  Progress: 1287 on 8876  Progress: 1288 on 8876  Progress: 1289 on 8876  Progress: 1290 on 8876  Progress: 1291 on 8876  Progress: 1292 on 8876  Progress: 1293 on 8876  Progress: 1294 on 8876  Progress: 1295 on 8876  Progress: 1296 on 8876  Progress: 1297 on 8876  Progress: 1298 on 8876  Progress: 1299 on 8876  Progress: 1300 on 8876  Progress: 1301 on 8876  Progress: 1302 on 8876  Progress: 1303 on 8876  Progress: 1304 on 8876  Progress: 1305 on 8876  Progress: 1306 on 8876  Progress: 1307 on 8876  Progress: 1308 on 8876  Progress: 1309 on 8876  Progress: 1310 on 8876  Progress: 1311 on 8876  Progress: 1312 on 8876  Progress: 1313 on 8876  Progress: 1314 on 8876  Progress: 1315 on 8876  Progress: 1316 on 8876  Progress: 1317 on 8876  Progress: 1318 on 8876  Progress: 1319 on 8876  Progress: 1320 on 8876  Progress: 1321 on 8876  Progress: 1322 on 8876  Progress: 1323 on 8876  Progress: 1324 on 8876  Progress: 1325 on 8876  Progress: 1326 on 8876  Progress: 1327 on 8876  Progress: 1328 on 8876  Progress: 1329 on 8876  Progress: 1330 on 8876  Progress: 1331 on 8876  Progress: 1332 on 8876  Progress: 1333 on 8876  Progress: 1334 on 8876  Progress: 1335 on 8876  Progress: 1336 on 8876  Progress: 1337 on 8876  Progress: 1338 on 8876  Progress: 1339 on 8876  Progress: 1340 on 8876  Progress: 1341 on 8876  Progress: 1342 on 8876  Progress: 1343 on 8876  Progress: 1344 on 8876  Progress: 1345 on 8876  Progress: 1346 on 8876  Progress: 1347 on 8876  Progress: 1348 on 8876  Progress: 1349 on 8876  Progress: 1350 on 8876  Progress: 1351 on 8876  Progress: 1352 on 8876  Progress: 1353 on 8876  Progress: 1354 on 8876  Progress: 1355 on 8876  Progress: 1356 on 8876  Progress: 1357 on 8876  Progress: 1358 on 8876  Progress: 1359 on 8876  Progress: 1360 on 8876  Progress: 1361 on 8876  Progress: 1362 on 8876  Progress: 1363 on 8876  Progress: 1364 on 8876  Progress: 1365 on 8876  Progress: 1366 on 8876  Progress: 1367 on 8876  Progress: 1368 on 8876  Progress: 1369 on 8876  Progress: 1370 on 8876  Progress: 1371 on 8876  Progress: 1372 on 8876  Progress: 1373 on 8876  Progress: 1374 on 8876  Progress: 1375 on 8876  Progress: 1376 on 8876  Progress: 1377 on 8876  Progress: 1378 on 8876  Progress: 1379 on 8876  Progress: 1380 on 8876  Progress: 1381 on 8876  Progress: 1382 on 8876  Progress: 1383 on 8876  Progress: 1384 on 8876  Progress: 1385 on 8876  Progress: 1386 on 8876  Progress: 1387 on 8876  Progress: 1388 on 8876  Progress: 1389 on 8876  Progress: 1390 on 8876  Progress: 1391 on 8876  Progress: 1392 on 8876  Progress: 1393 on 8876  Progress: 1394 on 8876  Progress: 1395 on 8876  Progress: 1396 on 8876  Progress: 1397 on 8876  Progress: 1398 on 8876  Progress: 1399 on 8876  Progress: 1400 on 8876  Progress: 1401 on 8876  Progress: 1402 on 8876  Progress: 1403 on 8876  Progress: 1404 on 8876  Progress: 1405 on 8876  Progress: 1406 on 8876  Progress: 1407 on 8876  Progress: 1408 on 8876  Progress: 1409 on 8876  Progress: 1410 on 8876  Progress: 1411 on 8876  Progress: 1412 on 8876  Progress: 1413 on 8876  Progress: 1414 on 8876  Progress: 1415 on 8876  Progress: 1416 on 8876  Progress: 1417 on 8876  Progress: 1418 on 8876  Progress: 1419 on 8876  Progress: 1420 on 8876  Progress: 1421 on 8876  Progress: 1422 on 8876  Progress: 1423 on 8876  Progress: 1424 on 8876  Progress: 1425 on 8876  Progress: 1426 on 8876  Progress: 1427 on 8876  Progress: 1428 on 8876  Progress: 1429 on 8876  Progress: 1430 on 8876  Progress: 1431 on 8876  Progress: 1432 on 8876  Progress: 1433 on 8876  Progress: 1434 on 8876  Progress: 1435 on 8876  Progress: 1436 on 8876  Progress: 1437 on 8876  Progress: 1438 on 8876  Progress: 1439 on 8876  Progress: 1440 on 8876  Progress: 1441 on 8876  Progress: 1442 on 8876  Progress: 1443 on 8876  Progress: 1444 on 8876  Progress: 1445 on 8876  Progress: 1446 on 8876  Progress: 1447 on 8876  Progress: 1448 on 8876  Progress: 1449 on 8876  Progress: 1450 on 8876  Progress: 1451 on 8876  Progress: 1452 on 8876  Progress: 1453 on 8876  Progress: 1454 on 8876  Progress: 1455 on 8876  Progress: 1456 on 8876  Progress: 1457 on 8876  Progress: 1458 on 8876  Progress: 1459 on 8876  Progress: 1460 on 8876  Progress: 1461 on 8876  Progress: 1462 on 8876  Progress: 1463 on 8876  Progress: 1464 on 8876  Progress: 1465 on 8876  Progress: 1466 on 8876  Progress: 1467 on 8876  Progress: 1468 on 8876  Progress: 1469 on 8876  Progress: 1470 on 8876  Progress: 1471 on 8876  Progress: 1472 on 8876  Progress: 1473 on 8876  Progress: 1474 on 8876  Progress: 1475 on 8876  Progress: 1476 on 8876  Progress: 1477 on 8876  Progress: 1478 on 8876  Progress: 1479 on 8876  Progress: 1480 on 8876  Progress: 1481 on 8876  Progress: 1482 on 8876  Progress: 1483 on 8876  Progress: 1484 on 8876  Progress: 1485 on 8876  Progress: 1486 on 8876  Progress: 1487 on 8876  Progress: 1488 on 8876  Progress: 1489 on 8876  Progress: 1490 on 8876  Progress: 1491 on 8876  Progress: 1492 on 8876  Progress: 1493 on 8876  Progress: 1494 on 8876  Progress: 1495 on 8876  Progress: 1496 on 8876  Progress: 1497 on 8876  Progress: 1498 on 8876  Progress: 1499 on 8876  Progress: 1500 on 8876  Progress: 1501 on 8876  Progress: 1502 on 8876  Progress: 1503 on 8876  Progress: 1504 on 8876  Progress: 1505 on 8876  Progress: 1506 on 8876  Progress: 1507 on 8876  Progress: 1508 on 8876  Progress: 1509 on 8876  Progress: 1510 on 8876  Progress: 1511 on 8876  Progress: 1512 on 8876  Progress: 1513 on 8876  Progress: 1514 on 8876  Progress: 1515 on 8876  Progress: 1516 on 8876  Progress: 1517 on 8876  Progress: 1518 on 8876  Progress: 1519 on 8876  Progress: 1520 on 8876  Progress: 1521 on 8876  Progress: 1522 on 8876  Progress: 1523 on 8876  Progress: 1524 on 8876  Progress: 1525 on 8876  Progress: 1526 on 8876  Progress: 1527 on 8876  Progress: 1528 on 8876  Progress: 1529 on 8876  Progress: 1530 on 8876  Progress: 1531 on 8876  Progress: 1532 on 8876  Progress: 1533 on 8876  Progress: 1534 on 8876  Progress: 1535 on 8876  Progress: 1536 on 8876  Progress: 1537 on 8876  Progress: 1538 on 8876  Progress: 1539 on 8876  Progress: 1540 on 8876  Progress: 1541 on 8876  Progress: 1542 on 8876  Progress: 1543 on 8876  Progress: 1544 on 8876  Progress: 1545 on 8876  Progress: 1546 on 8876  Progress: 1547 on 8876  Progress: 1548 on 8876  Progress: 1549 on 8876  Progress: 1550 on 8876  Progress: 1551 on 8876  Progress: 1552 on 8876  Progress: 1553 on 8876  Progress: 1554 on 8876  Progress: 1555 on 8876  Progress: 1556 on 8876  Progress: 1557 on 8876  Progress: 1558 on 8876  Progress: 1559 on 8876  Progress: 1560 on 8876  Progress: 1561 on 8876  Progress: 1562 on 8876  Progress: 1563 on 8876  Progress: 1564 on 8876  Progress: 1565 on 8876  Progress: 1566 on 8876  Progress: 1567 on 8876  Progress: 1568 on 8876  Progress: 1569 on 8876  Progress: 1570 on 8876  Progress: 1571 on 8876  Progress: 1572 on 8876  Progress: 1573 on 8876  Progress: 1574 on 8876  Progress: 1575 on 8876  Progress: 1576 on 8876  Progress: 1577 on 8876  Progress: 1578 on 8876  Progress: 1579 on 8876  Progress: 1580 on 8876  Progress: 1581 on 8876  Progress: 1582 on 8876  Progress: 1583 on 8876  Progress: 1584 on 8876  Progress: 1585 on 8876  Progress: 1586 on 8876  Progress: 1587 on 8876  Progress: 1588 on 8876  Progress: 1589 on 8876  Progress: 1590 on 8876  Progress: 1591 on 8876  Progress: 1592 on 8876  Progress: 1593 on 8876  Progress: 1594 on 8876  Progress: 1595 on 8876  Progress: 1596 on 8876  Progress: 1597 on 8876  Progress: 1598 on 8876  Progress: 1599 on 8876  Progress: 1600 on 8876  Progress: 1601 on 8876  Progress: 1602 on 8876  Progress: 1603 on 8876  Progress: 1604 on 8876  Progress: 1605 on 8876  Progress: 1606 on 8876  Progress: 1607 on 8876  Progress: 1608 on 8876  Progress: 1609 on 8876  Progress: 1610 on 8876  Progress: 1611 on 8876  Progress: 1612 on 8876  Progress: 1613 on 8876  Progress: 1614 on 8876  Progress: 1615 on 8876  Progress: 1616 on 8876  Progress: 1617 on 8876  Progress: 1618 on 8876  Progress: 1619 on 8876  Progress: 1620 on 8876  Progress: 1621 on 8876  Progress: 1622 on 8876  Progress: 1623 on 8876  Progress: 1624 on 8876  Progress: 1625 on 8876  Progress: 1626 on 8876  Progress: 1627 on 8876  Progress: 1628 on 8876  Progress: 1629 on 8876  Progress: 1630 on 8876  Progress: 1631 on 8876  Progress: 1632 on 8876  Progress: 1633 on 8876  Progress: 1634 on 8876  Progress: 1635 on 8876  Progress: 1636 on 8876  Progress: 1637 on 8876  Progress: 1638 on 8876  Progress: 1639 on 8876  Progress: 1640 on 8876  Progress: 1641 on 8876  Progress: 1642 on 8876  Progress: 1643 on 8876  Progress: 1644 on 8876  Progress: 1645 on 8876  Progress: 1646 on 8876  Progress: 1647 on 8876  Progress: 1648 on 8876  Progress: 1649 on 8876  Progress: 1650 on 8876  Progress: 1651 on 8876  Progress: 1652 on 8876  Progress: 1653 on 8876  Progress: 1654 on 8876  Progress: 1655 on 8876  Progress: 1656 on 8876  Progress: 1657 on 8876  Progress: 1658 on 8876  Progress: 1659 on 8876  Progress: 1660 on 8876  Progress: 1661 on 8876  Progress: 1662 on 8876  Progress: 1663 on 8876  Progress: 1664 on 8876  Progress: 1665 on 8876  Progress: 1666 on 8876  Progress: 1667 on 8876  Progress: 1668 on 8876  Progress: 1669 on 8876  Progress: 1670 on 8876  Progress: 1671 on 8876  Progress: 1672 on 8876  Progress: 1673 on 8876  Progress: 1674 on 8876  Progress: 1675 on 8876  Progress: 1676 on 8876  Progress: 1677 on 8876  Progress: 1678 on 8876  Progress: 1679 on 8876  Progress: 1680 on 8876  Progress: 1681 on 8876  Progress: 1682 on 8876  Progress: 1683 on 8876  Progress: 1684 on 8876  Progress: 1685 on 8876  Progress: 1686 on 8876  Progress: 1687 on 8876  Progress: 1688 on 8876  Progress: 1689 on 8876  Progress: 1690 on 8876  Progress: 1691 on 8876  Progress: 1692 on 8876  Progress: 1693 on 8876  Progress: 1694 on 8876  Progress: 1695 on 8876  Progress: 1696 on 8876  Progress: 1697 on 8876  Progress: 1698 on 8876  Progress: 1699 on 8876  Progress: 1700 on 8876  Progress: 1701 on 8876  Progress: 1702 on 8876  Progress: 1703 on 8876  Progress: 1704 on 8876  Progress: 1705 on 8876  Progress: 1706 on 8876  Progress: 1707 on 8876  Progress: 1708 on 8876  Progress: 1709 on 8876  Progress: 1710 on 8876  Progress: 1711 on 8876  Progress: 1712 on 8876  Progress: 1713 on 8876  Progress: 1714 on 8876  Progress: 1715 on 8876  Progress: 1716 on 8876  Progress: 1717 on 8876  Progress: 1718 on 8876  Progress: 1719 on 8876  Progress: 1720 on 8876  Progress: 1721 on 8876  Progress: 1722 on 8876  Progress: 1723 on 8876  Progress: 1724 on 8876  Progress: 1725 on 8876  Progress: 1726 on 8876  Progress: 1727 on 8876  Progress: 1728 on 8876  Progress: 1729 on 8876  Progress: 1730 on 8876  Progress: 1731 on 8876  Progress: 1732 on 8876  Progress: 1733 on 8876  Progress: 1734 on 8876  Progress: 1735 on 8876  Progress: 1736 on 8876  Progress: 1737 on 8876  Progress: 1738 on 8876  Progress: 1739 on 8876  Progress: 1740 on 8876  Progress: 1741 on 8876  Progress: 1742 on 8876  Progress: 1743 on 8876  Progress: 1744 on 8876  Progress: 1745 on 8876  Progress: 1746 on 8876  Progress: 1747 on 8876  Progress: 1748 on 8876  Progress: 1749 on 8876  Progress: 1750 on 8876  Progress: 1751 on 8876  Progress: 1752 on 8876  Progress: 1753 on 8876  Progress: 1754 on 8876  Progress: 1755 on 8876  Progress: 1756 on 8876  Progress: 1757 on 8876  Progress: 1758 on 8876  Progress: 1759 on 8876  Progress: 1760 on 8876  Progress: 1761 on 8876  Progress: 1762 on 8876  Progress: 1763 on 8876  Progress: 1764 on 8876  Progress: 1765 on 8876  Progress: 1766 on 8876  Progress: 1767 on 8876  Progress: 1768 on 8876  Progress: 1769 on 8876  Progress: 1770 on 8876  Progress: 1771 on 8876  Progress: 1772 on 8876  Progress: 1773 on 8876  Progress: 1774 on 8876  Progress: 1775 on 8876  Progress: 1776 on 8876  Progress: 1777 on 8876  Progress: 1778 on 8876  Progress: 1779 on 8876  Progress: 1780 on 8876  Progress: 1781 on 8876  Progress: 1782 on 8876  Progress: 1783 on 8876  Progress: 1784 on 8876  Progress: 1785 on 8876  Progress: 1786 on 8876  Progress: 1787 on 8876  Progress: 1788 on 8876  Progress: 1789 on 8876  Progress: 1790 on 8876  Progress: 1791 on 8876  Progress: 1792 on 8876  Progress: 1793 on 8876  Progress: 1794 on 8876  Progress: 1795 on 8876  Progress: 1796 on 8876  Progress: 1797 on 8876  Progress: 1798 on 8876  Progress: 1799 on 8876  Progress: 1800 on 8876  Progress: 1801 on 8876  Progress: 1802 on 8876  Progress: 1803 on 8876  Progress: 1804 on 8876  Progress: 1805 on 8876  Progress: 1806 on 8876  Progress: 1807 on 8876  Progress: 1808 on 8876  Progress: 1809 on 8876  Progress: 1810 on 8876  Progress: 1811 on 8876  Progress: 1812 on 8876  Progress: 1813 on 8876  Progress: 1814 on 8876  Progress: 1815 on 8876  Progress: 1816 on 8876  Progress: 1817 on 8876  Progress: 1818 on 8876  Progress: 1819 on 8876  Progress: 1820 on 8876  Progress: 1821 on 8876  Progress: 1822 on 8876  Progress: 1823 on 8876  Progress: 1824 on 8876  Progress: 1825 on 8876  Progress: 1826 on 8876  Progress: 1827 on 8876  Progress: 1828 on 8876  Progress: 1829 on 8876  Progress: 1830 on 8876  Progress: 1831 on 8876  Progress: 1832 on 8876  Progress: 1833 on 8876  Progress: 1834 on 8876  Progress: 1835 on 8876  Progress: 1836 on 8876  Progress: 1837 on 8876  Progress: 1838 on 8876  Progress: 1839 on 8876  Progress: 1840 on 8876  Progress: 1841 on 8876  Progress: 1842 on 8876  Progress: 1843 on 8876  Progress: 1844 on 8876  Progress: 1845 on 8876  Progress: 1846 on 8876  Progress: 1847 on 8876  Progress: 1848 on 8876  Progress: 1849 on 8876  Progress: 1850 on 8876  Progress: 1851 on 8876  Progress: 1852 on 8876  Progress: 1853 on 8876  Progress: 1854 on 8876  Progress: 1855 on 8876  Progress: 1856 on 8876  Progress: 1857 on 8876  Progress: 1858 on 8876  Progress: 1859 on 8876  Progress: 1860 on 8876  Progress: 1861 on 8876  Progress: 1862 on 8876  Progress: 1863 on 8876  Progress: 1864 on 8876  Progress: 1865 on 8876  Progress: 1866 on 8876  Progress: 1867 on 8876  Progress: 1868 on 8876  Progress: 1869 on 8876  Progress: 1870 on 8876  Progress: 1871 on 8876  Progress: 1872 on 8876  Progress: 1873 on 8876  Progress: 1874 on 8876  Progress: 1875 on 8876  Progress: 1876 on 8876  Progress: 1877 on 8876  Progress: 1878 on 8876  Progress: 1879 on 8876  Progress: 1880 on 8876  Progress: 1881 on 8876  Progress: 1882 on 8876  Progress: 1883 on 8876  Progress: 1884 on 8876  Progress: 1885 on 8876  Progress: 1886 on 8876  Progress: 1887 on 8876  Progress: 1888 on 8876  Progress: 1889 on 8876  Progress: 1890 on 8876  Progress: 1891 on 8876  Progress: 1892 on 8876  Progress: 1893 on 8876  Progress: 1894 on 8876  Progress: 1895 on 8876  Progress: 1896 on 8876  Progress: 1897 on 8876  Progress: 1898 on 8876  Progress: 1899 on 8876  Progress: 1900 on 8876  Progress: 1901 on 8876  Progress: 1902 on 8876  Progress: 1903 on 8876  Progress: 1904 on 8876  Progress: 1905 on 8876  Progress: 1906 on 8876  Progress: 1907 on 8876  Progress: 1908 on 8876  Progress: 1909 on 8876  Progress: 1910 on 8876  Progress: 1911 on 8876  Progress: 1912 on 8876  Progress: 1913 on 8876  Progress: 1914 on 8876  Progress: 1915 on 8876  Progress: 1916 on 8876  Progress: 1917 on 8876  Progress: 1918 on 8876  Progress: 1919 on 8876  Progress: 1920 on 8876  Progress: 1921 on 8876  Progress: 1922 on 8876  Progress: 1923 on 8876  Progress: 1924 on 8876  Progress: 1925 on 8876  Progress: 1926 on 8876  Progress: 1927 on 8876  Progress: 1928 on 8876  Progress: 1929 on 8876  Progress: 1930 on 8876  Progress: 1931 on 8876  Progress: 1932 on 8876  Progress: 1933 on 8876  Progress: 1934 on 8876  Progress: 1935 on 8876  Progress: 1936 on 8876  Progress: 1937 on 8876  Progress: 1938 on 8876  Progress: 1939 on 8876  Progress: 1940 on 8876  Progress: 1941 on 8876  Progress: 1942 on 8876  Progress: 1943 on 8876  Progress: 1944 on 8876  Progress: 1945 on 8876  Progress: 1946 on 8876  Progress: 1947 on 8876  Progress: 1948 on 8876  Progress: 1949 on 8876  Progress: 1950 on 8876  Progress: 1951 on 8876  Progress: 1952 on 8876  Progress: 1953 on 8876  Progress: 1954 on 8876  Progress: 1955 on 8876  Progress: 1956 on 8876  Progress: 1957 on 8876  Progress: 1958 on 8876  Progress: 1959 on 8876  Progress: 1960 on 8876  Progress: 1961 on 8876  Progress: 1962 on 8876  Progress: 1963 on 8876  Progress: 1964 on 8876  Progress: 1965 on 8876  Progress: 1966 on 8876  Progress: 1967 on 8876  Progress: 1968 on 8876  Progress: 1969 on 8876  Progress: 1970 on 8876  Progress: 1971 on 8876  Progress: 1972 on 8876  Progress: 1973 on 8876  Progress: 1974 on 8876  Progress: 1975 on 8876  Progress: 1976 on 8876  Progress: 1977 on 8876  Progress: 1978 on 8876  Progress: 1979 on 8876  Progress: 1980 on 8876  Progress: 1981 on 8876  Progress: 1982 on 8876  Progress: 1983 on 8876  Progress: 1984 on 8876  Progress: 1985 on 8876  Progress: 1986 on 8876  Progress: 1987 on 8876  Progress: 1988 on 8876  Progress: 1989 on 8876  Progress: 1990 on 8876  Progress: 1991 on 8876  Progress: 1992 on 8876  Progress: 1993 on 8876  Progress: 1994 on 8876  Progress: 1995 on 8876  Progress: 1996 on 8876  Progress: 1997 on 8876  Progress: 1998 on 8876  Progress: 1999 on 8876  Progress: 2000 on 8876  Progress: 2001 on 8876  Progress: 2002 on 8876  Progress: 2003 on 8876  Progress: 2004 on 8876  Progress: 2005 on 8876  Progress: 2006 on 8876  Progress: 2007 on 8876  Progress: 2008 on 8876  Progress: 2009 on 8876  Progress: 2010 on 8876  Progress: 2011 on 8876  Progress: 2012 on 8876  Progress: 2013 on 8876  Progress: 2014 on 8876  Progress: 2015 on 8876  Progress: 2016 on 8876  Progress: 2017 on 8876  Progress: 2018 on 8876  Progress: 2019 on 8876  Progress: 2020 on 8876  Progress: 2021 on 8876  Progress: 2022 on 8876  Progress: 2023 on 8876  Progress: 2024 on 8876  Progress: 2025 on 8876  Progress: 2026 on 8876  Progress: 2027 on 8876  Progress: 2028 on 8876  Progress: 2029 on 8876  Progress: 2030 on 8876  Progress: 2031 on 8876  Progress: 2032 on 8876  Progress: 2033 on 8876  Progress: 2034 on 8876  Progress: 2035 on 8876  Progress: 2036 on 8876  Progress: 2037 on 8876  Progress: 2038 on 8876  Progress: 2039 on 8876  Progress: 2040 on 8876  Progress: 2041 on 8876  Progress: 2042 on 8876  Progress: 2043 on 8876  Progress: 2044 on 8876  Progress: 2045 on 8876  Progress: 2046 on 8876  Progress: 2047 on 8876  Progress: 2048 on 8876  Progress: 2049 on 8876  Progress: 2050 on 8876  Progress: 2051 on 8876  Progress: 2052 on 8876  Progress: 2053 on 8876  Progress: 2054 on 8876  Progress: 2055 on 8876  Progress: 2056 on 8876  Progress: 2057 on 8876  Progress: 2058 on 8876  Progress: 2059 on 8876  Progress: 2060 on 8876  Progress: 2061 on 8876  Progress: 2062 on 8876  Progress: 2063 on 8876  Progress: 2064 on 8876  Progress: 2065 on 8876  Progress: 2066 on 8876  Progress: 2067 on 8876  Progress: 2068 on 8876  Progress: 2069 on 8876  Progress: 2070 on 8876  Progress: 2071 on 8876  Progress: 2072 on 8876  Progress: 2073 on 8876  Progress: 2074 on 8876  Progress: 2075 on 8876  Progress: 2076 on 8876  Progress: 2077 on 8876  Progress: 2078 on 8876  Progress: 2079 on 8876  Progress: 2080 on 8876  Progress: 2081 on 8876  Progress: 2082 on 8876  Progress: 2083 on 8876  Progress: 2084 on 8876  Progress: 2085 on 8876  Progress: 2086 on 8876  Progress: 2087 on 8876  Progress: 2088 on 8876  Progress: 2089 on 8876  Progress: 2090 on 8876  Progress: 2091 on 8876  Progress: 2092 on 8876  Progress: 2093 on 8876  Progress: 2094 on 8876  Progress: 2095 on 8876  Progress: 2096 on 8876  Progress: 2097 on 8876  Progress: 2098 on 8876  Progress: 2099 on 8876  Progress: 2100 on 8876  Progress: 2101 on 8876  Progress: 2102 on 8876  Progress: 2103 on 8876  Progress: 2104 on 8876  Progress: 2105 on 8876  Progress: 2106 on 8876  Progress: 2107 on 8876  Progress: 2108 on 8876  Progress: 2109 on 8876  Progress: 2110 on 8876  Progress: 2111 on 8876  Progress: 2112 on 8876  Progress: 2113 on 8876  Progress: 2114 on 8876  Progress: 2115 on 8876  Progress: 2116 on 8876  Progress: 2117 on 8876  Progress: 2118 on 8876  Progress: 2119 on 8876  Progress: 2120 on 8876  Progress: 2121 on 8876  Progress: 2122 on 8876  Progress: 2123 on 8876  Progress: 2124 on 8876  Progress: 2125 on 8876  Progress: 2126 on 8876  Progress: 2127 on 8876  Progress: 2128 on 8876  Progress: 2129 on 8876  Progress: 2130 on 8876  Progress: 2131 on 8876  Progress: 2132 on 8876  Progress: 2133 on 8876  Progress: 2134 on 8876  Progress: 2135 on 8876  Progress: 2136 on 8876  Progress: 2137 on 8876  Progress: 2138 on 8876  Progress: 2139 on 8876  Progress: 2140 on 8876  Progress: 2141 on 8876  Progress: 2142 on 8876  Progress: 2143 on 8876  Progress: 2144 on 8876  Progress: 2145 on 8876  Progress: 2146 on 8876  Progress: 2147 on 8876  Progress: 2148 on 8876  Progress: 2149 on 8876  Progress: 2150 on 8876  Progress: 2151 on 8876  Progress: 2152 on 8876  Progress: 2153 on 8876  Progress: 2154 on 8876  Progress: 2155 on 8876  Progress: 2156 on 8876  Progress: 2157 on 8876  Progress: 2158 on 8876  Progress: 2159 on 8876  Progress: 2160 on 8876  Progress: 2161 on 8876  Progress: 2162 on 8876  Progress: 2163 on 8876  Progress: 2164 on 8876  Progress: 2165 on 8876  Progress: 2166 on 8876  Progress: 2167 on 8876  Progress: 2168 on 8876  Progress: 2169 on 8876  Progress: 2170 on 8876  Progress: 2171 on 8876  Progress: 2172 on 8876  Progress: 2173 on 8876  Progress: 2174 on 8876  Progress: 2175 on 8876  Progress: 2176 on 8876  Progress: 2177 on 8876  Progress: 2178 on 8876  Progress: 2179 on 8876  Progress: 2180 on 8876  Progress: 2181 on 8876  Progress: 2182 on 8876  Progress: 2183 on 8876  Progress: 2184 on 8876  Progress: 2185 on 8876  Progress: 2186 on 8876  Progress: 2187 on 8876  Progress: 2188 on 8876  Progress: 2189 on 8876  Progress: 2190 on 8876  Progress: 2191 on 8876  Progress: 2192 on 8876  Progress: 2193 on 8876  Progress: 2194 on 8876  Progress: 2195 on 8876  Progress: 2196 on 8876  Progress: 2197 on 8876  Progress: 2198 on 8876  Progress: 2199 on 8876  Progress: 2200 on 8876  Progress: 2201 on 8876  Progress: 2202 on 8876  Progress: 2203 on 8876  Progress: 2204 on 8876  Progress: 2205 on 8876  Progress: 2206 on 8876  Progress: 2207 on 8876  Progress: 2208 on 8876  Progress: 2209 on 8876  Progress: 2210 on 8876  Progress: 2211 on 8876  Progress: 2212 on 8876  Progress: 2213 on 8876  Progress: 2214 on 8876  Progress: 2215 on 8876  Progress: 2216 on 8876  Progress: 2217 on 8876  Progress: 2218 on 8876  Progress: 2219 on 8876  Progress: 2220 on 8876  Progress: 2221 on 8876  Progress: 2222 on 8876  Progress: 2223 on 8876  Progress: 2224 on 8876  Progress: 2225 on 8876  Progress: 2226 on 8876  Progress: 2227 on 8876  Progress: 2228 on 8876  Progress: 2229 on 8876  Progress: 2230 on 8876  Progress: 2231 on 8876  Progress: 2232 on 8876  Progress: 2233 on 8876  Progress: 2234 on 8876  Progress: 2235 on 8876  Progress: 2236 on 8876  Progress: 2237 on 8876  Progress: 2238 on 8876  Progress: 2239 on 8876  Progress: 2240 on 8876  Progress: 2241 on 8876  Progress: 2242 on 8876  Progress: 2243 on 8876  Progress: 2244 on 8876  Progress: 2245 on 8876  Progress: 2246 on 8876  Progress: 2247 on 8876  Progress: 2248 on 8876  Progress: 2249 on 8876  Progress: 2250 on 8876  Progress: 2251 on 8876  Progress: 2252 on 8876  Progress: 2253 on 8876  Progress: 2254 on 8876  Progress: 2255 on 8876  Progress: 2256 on 8876  Progress: 2257 on 8876  Progress: 2258 on 8876  Progress: 2259 on 8876  Progress: 2260 on 8876  Progress: 2261 on 8876  Progress: 2262 on 8876  Progress: 2263 on 8876  Progress: 2264 on 8876  Progress: 2265 on 8876  Progress: 2266 on 8876  Progress: 2267 on 8876  Progress: 2268 on 8876  Progress: 2269 on 8876  Progress: 2270 on 8876  Progress: 2271 on 8876  Progress: 2272 on 8876  Progress: 2273 on 8876  Progress: 2274 on 8876  Progress: 2275 on 8876  Progress: 2276 on 8876  Progress: 2277 on 8876  Progress: 2278 on 8876  Progress: 2279 on 8876  Progress: 2280 on 8876  Progress: 2281 on 8876  Progress: 2282 on 8876  Progress: 2283 on 8876  Progress: 2284 on 8876  Progress: 2285 on 8876  Progress: 2286 on 8876  Progress: 2287 on 8876  Progress: 2288 on 8876  Progress: 2289 on 8876  Progress: 2290 on 8876  Progress: 2291 on 8876  Progress: 2292 on 8876  Progress: 2293 on 8876  Progress: 2294 on 8876  Progress: 2295 on 8876  Progress: 2296 on 8876  Progress: 2297 on 8876  Progress: 2298 on 8876  Progress: 2299 on 8876  Progress: 2300 on 8876  Progress: 2301 on 8876  Progress: 2302 on 8876  Progress: 2303 on 8876  Progress: 2304 on 8876  Progress: 2305 on 8876  Progress: 2306 on 8876  Progress: 2307 on 8876  Progress: 2308 on 8876  Progress: 2309 on 8876  Progress: 2310 on 8876  Progress: 2311 on 8876  Progress: 2312 on 8876  Progress: 2313 on 8876  Progress: 2314 on 8876  Progress: 2315 on 8876  Progress: 2316 on 8876  Progress: 2317 on 8876  Progress: 2318 on 8876  Progress: 2319 on 8876  Progress: 2320 on 8876  Progress: 2321 on 8876  Progress: 2322 on 8876  Progress: 2323 on 8876  Progress: 2324 on 8876  Progress: 2325 on 8876  Progress: 2326 on 8876  Progress: 2327 on 8876  Progress: 2328 on 8876  Progress: 2329 on 8876  Progress: 2330 on 8876  Progress: 2331 on 8876  Progress: 2332 on 8876  Progress: 2333 on 8876  Progress: 2334 on 8876  Progress: 2335 on 8876  Progress: 2336 on 8876  Progress: 2337 on 8876  Progress: 2338 on 8876  Progress: 2339 on 8876  Progress: 2340 on 8876  Progress: 2341 on 8876  Progress: 2342 on 8876  Progress: 2343 on 8876  Progress: 2344 on 8876  Progress: 2345 on 8876  Progress: 2346 on 8876  Progress: 2347 on 8876  Progress: 2348 on 8876  Progress: 2349 on 8876  Progress: 2350 on 8876  Progress: 2351 on 8876  Progress: 2352 on 8876  Progress: 2353 on 8876  Progress: 2354 on 8876  Progress: 2355 on 8876  Progress: 2356 on 8876  Progress: 2357 on 8876  Progress: 2358 on 8876  Progress: 2359 on 8876  Progress: 2360 on 8876  Progress: 2361 on 8876  Progress: 2362 on 8876  Progress: 2363 on 8876  Progress: 2364 on 8876  Progress: 2365 on 8876  Progress: 2366 on 8876  Progress: 2367 on 8876  Progress: 2368 on 8876  Progress: 2369 on 8876  Progress: 2370 on 8876  Progress: 2371 on 8876  Progress: 2372 on 8876  Progress: 2373 on 8876  Progress: 2374 on 8876  Progress: 2375 on 8876  Progress: 2376 on 8876  Progress: 2377 on 8876  Progress: 2378 on 8876  Progress: 2379 on 8876  Progress: 2380 on 8876  Progress: 2381 on 8876  Progress: 2382 on 8876  Progress: 2383 on 8876  Progress: 2384 on 8876  Progress: 2385 on 8876  Progress: 2386 on 8876  Progress: 2387 on 8876  Progress: 2388 on 8876  Progress: 2389 on 8876  Progress: 2390 on 8876  Progress: 2391 on 8876  Progress: 2392 on 8876  Progress: 2393 on 8876  Progress: 2394 on 8876  Progress: 2395 on 8876  Progress: 2396 on 8876  Progress: 2397 on 8876  Progress: 2398 on 8876  Progress: 2399 on 8876  Progress: 2400 on 8876  Progress: 2401 on 8876  Progress: 2402 on 8876  Progress: 2403 on 8876  Progress: 2404 on 8876  Progress: 2405 on 8876  Progress: 2406 on 8876  Progress: 2407 on 8876  Progress: 2408 on 8876  Progress: 2409 on 8876  Progress: 2410 on 8876  Progress: 2411 on 8876  Progress: 2412 on 8876  Progress: 2413 on 8876  Progress: 2414 on 8876  Progress: 2415 on 8876  Progress: 2416 on 8876  Progress: 2417 on 8876  Progress: 2418 on 8876  Progress: 2419 on 8876  Progress: 2420 on 8876  Progress: 2421 on 8876  Progress: 2422 on 8876  Progress: 2423 on 8876  Progress: 2424 on 8876  Progress: 2425 on 8876  Progress: 2426 on 8876  Progress: 2427 on 8876  Progress: 2428 on 8876  Progress: 2429 on 8876  Progress: 2430 on 8876  Progress: 2431 on 8876  Progress: 2432 on 8876  Progress: 2433 on 8876  Progress: 2434 on 8876  Progress: 2435 on 8876  Progress: 2436 on 8876  Progress: 2437 on 8876  Progress: 2438 on 8876  Progress: 2439 on 8876  Progress: 2440 on 8876  Progress: 2441 on 8876  Progress: 2442 on 8876  Progress: 2443 on 8876  Progress: 2444 on 8876  Progress: 2445 on 8876  Progress: 2446 on 8876  Progress: 2447 on 8876  Progress: 2448 on 8876  Progress: 2449 on 8876  Progress: 2450 on 8876  Progress: 2451 on 8876  Progress: 2452 on 8876  Progress: 2453 on 8876  Progress: 2454 on 8876  Progress: 2455 on 8876  Progress: 2456 on 8876  Progress: 2457 on 8876  Progress: 2458 on 8876  Progress: 2459 on 8876  Progress: 2460 on 8876  Progress: 2461 on 8876  Progress: 2462 on 8876  Progress: 2463 on 8876  Progress: 2464 on 8876  Progress: 2465 on 8876  Progress: 2466 on 8876  Progress: 2467 on 8876  Progress: 2468 on 8876  Progress: 2469 on 8876  Progress: 2470 on 8876  Progress: 2471 on 8876  Progress: 2472 on 8876  Progress: 2473 on 8876  Progress: 2474 on 8876  Progress: 2475 on 8876  Progress: 2476 on 8876  Progress: 2477 on 8876  Progress: 2478 on 8876  Progress: 2479 on 8876  Progress: 2480 on 8876  Progress: 2481 on 8876  Progress: 2482 on 8876  Progress: 2483 on 8876  Progress: 2484 on 8876  Progress: 2485 on 8876  Progress: 2486 on 8876  Progress: 2487 on 8876  Progress: 2488 on 8876  Progress: 2489 on 8876  Progress: 2490 on 8876  Progress: 2491 on 8876  Progress: 2492 on 8876  Progress: 2493 on 8876  Progress: 2494 on 8876  Progress: 2495 on 8876  Progress: 2496 on 8876  Progress: 2497 on 8876  Progress: 2498 on 8876  Progress: 2499 on 8876  Progress: 2500 on 8876  Progress: 2501 on 8876  Progress: 2502 on 8876  Progress: 2503 on 8876  Progress: 2504 on 8876  Progress: 2505 on 8876  Progress: 2506 on 8876  Progress: 2507 on 8876  Progress: 2508 on 8876  Progress: 2509 on 8876  Progress: 2510 on 8876  Progress: 2511 on 8876  Progress: 2512 on 8876  Progress: 2513 on 8876  Progress: 2514 on 8876  Progress: 2515 on 8876  Progress: 2516 on 8876  Progress: 2517 on 8876  Progress: 2518 on 8876  Progress: 2519 on 8876  Progress: 2520 on 8876  Progress: 2521 on 8876  Progress: 2522 on 8876  Progress: 2523 on 8876  Progress: 2524 on 8876  Progress: 2525 on 8876  Progress: 2526 on 8876  Progress: 2527 on 8876  Progress: 2528 on 8876  Progress: 2529 on 8876  Progress: 2530 on 8876  Progress: 2531 on 8876  Progress: 2532 on 8876  Progress: 2533 on 8876  Progress: 2534 on 8876  Progress: 2535 on 8876  Progress: 2536 on 8876  Progress: 2537 on 8876  Progress: 2538 on 8876  Progress: 2539 on 8876  Progress: 2540 on 8876  Progress: 2541 on 8876  Progress: 2542 on 8876  Progress: 2543 on 8876  Progress: 2544 on 8876  Progress: 2545 on 8876  Progress: 2546 on 8876  Progress: 2547 on 8876  Progress: 2548 on 8876  Progress: 2549 on 8876  Progress: 2550 on 8876  Progress: 2551 on 8876  Progress: 2552 on 8876  Progress: 2553 on 8876  Progress: 2554 on 8876  Progress: 2555 on 8876  Progress: 2556 on 8876  Progress: 2557 on 8876  Progress: 2558 on 8876  Progress: 2559 on 8876  Progress: 2560 on 8876  Progress: 2561 on 8876  Progress: 2562 on 8876  Progress: 2563 on 8876  Progress: 2564 on 8876  Progress: 2565 on 8876  Progress: 2566 on 8876  Progress: 2567 on 8876  Progress: 2568 on 8876  Progress: 2569 on 8876  Progress: 2570 on 8876  Progress: 2571 on 8876  Progress: 2572 on 8876  Progress: 2573 on 8876  Progress: 2574 on 8876  Progress: 2575 on 8876  Progress: 2576 on 8876  Progress: 2577 on 8876  Progress: 2578 on 8876  Progress: 2579 on 8876  Progress: 2580 on 8876  Progress: 2581 on 8876  Progress: 2582 on 8876  Progress: 2583 on 8876  Progress: 2584 on 8876  Progress: 2585 on 8876  Progress: 2586 on 8876  Progress: 2587 on 8876  Progress: 2588 on 8876  Progress: 2589 on 8876  Progress: 2590 on 8876  Progress: 2591 on 8876  Progress: 2592 on 8876  Progress: 2593 on 8876  Progress: 2594 on 8876  Progress: 2595 on 8876  Progress: 2596 on 8876  Progress: 2597 on 8876  Progress: 2598 on 8876  Progress: 2599 on 8876  Progress: 2600 on 8876  Progress: 2601 on 8876  Progress: 2602 on 8876  Progress: 2603 on 8876  Progress: 2604 on 8876  Progress: 2605 on 8876  Progress: 2606 on 8876  Progress: 2607 on 8876  Progress: 2608 on 8876  Progress: 2609 on 8876  Progress: 2610 on 8876  Progress: 2611 on 8876  Progress: 2612 on 8876  Progress: 2613 on 8876  Progress: 2614 on 8876  Progress: 2615 on 8876  Progress: 2616 on 8876  Progress: 2617 on 8876  Progress: 2618 on 8876  Progress: 2619 on 8876  Progress: 2620 on 8876  Progress: 2621 on 8876  Progress: 2622 on 8876  Progress: 2623 on 8876  Progress: 2624 on 8876  Progress: 2625 on 8876  Progress: 2626 on 8876  Progress: 2627 on 8876  Progress: 2628 on 8876  Progress: 2629 on 8876  Progress: 2630 on 8876  Progress: 2631 on 8876  Progress: 2632 on 8876  Progress: 2633 on 8876  Progress: 2634 on 8876  Progress: 2635 on 8876  Progress: 2636 on 8876  Progress: 2637 on 8876  Progress: 2638 on 8876  Progress: 2639 on 8876  Progress: 2640 on 8876  Progress: 2641 on 8876  Progress: 2642 on 8876  Progress: 2643 on 8876  Progress: 2644 on 8876  Progress: 2645 on 8876  Progress: 2646 on 8876  Progress: 2647 on 8876  Progress: 2648 on 8876  Progress: 2649 on 8876  Progress: 2650 on 8876  Progress: 2651 on 8876  Progress: 2652 on 8876  Progress: 2653 on 8876  Progress: 2654 on 8876  Progress: 2655 on 8876  Progress: 2656 on 8876  Progress: 2657 on 8876  Progress: 2658 on 8876  Progress: 2659 on 8876  Progress: 2660 on 8876  Progress: 2661 on 8876  Progress: 2662 on 8876  Progress: 2663 on 8876  Progress: 2664 on 8876  Progress: 2665 on 8876  Progress: 2666 on 8876  Progress: 2667 on 8876  Progress: 2668 on 8876  Progress: 2669 on 8876  Progress: 2670 on 8876  Progress: 2671 on 8876  Progress: 2672 on 8876  Progress: 2673 on 8876  Progress: 2674 on 8876  Progress: 2675 on 8876  Progress: 2676 on 8876  Progress: 2677 on 8876  Progress: 2678 on 8876  Progress: 2679 on 8876  Progress: 2680 on 8876  Progress: 2681 on 8876  Progress: 2682 on 8876  Progress: 2683 on 8876  Progress: 2684 on 8876  Progress: 2685 on 8876  Progress: 2686 on 8876  Progress: 2687 on 8876  Progress: 2688 on 8876  Progress: 2689 on 8876  Progress: 2690 on 8876  Progress: 2691 on 8876  Progress: 2692 on 8876  Progress: 2693 on 8876  Progress: 2694 on 8876  Progress: 2695 on 8876  Progress: 2696 on 8876  Progress: 2697 on 8876  Progress: 2698 on 8876  Progress: 2699 on 8876  Progress: 2700 on 8876  Progress: 2701 on 8876  Progress: 2702 on 8876  Progress: 2703 on 8876  Progress: 2704 on 8876  Progress: 2705 on 8876  Progress: 2706 on 8876  Progress: 2707 on 8876  Progress: 2708 on 8876  Progress: 2709 on 8876  Progress: 2710 on 8876  Progress: 2711 on 8876  Progress: 2712 on 8876  Progress: 2713 on 8876  Progress: 2714 on 8876  Progress: 2715 on 8876  Progress: 2716 on 8876  Progress: 2717 on 8876  Progress: 2718 on 8876  Progress: 2719 on 8876  Progress: 2720 on 8876  Progress: 2721 on 8876  Progress: 2722 on 8876  Progress: 2723 on 8876  Progress: 2724 on 8876  Progress: 2725 on 8876  Progress: 2726 on 8876  Progress: 2727 on 8876  Progress: 2728 on 8876  Progress: 2729 on 8876  Progress: 2730 on 8876  Progress: 2731 on 8876  Progress: 2732 on 8876  Progress: 2733 on 8876  Progress: 2734 on 8876  Progress: 2735 on 8876  Progress: 2736 on 8876  Progress: 2737 on 8876  Progress: 2738 on 8876  Progress: 2739 on 8876  Progress: 2740 on 8876  Progress: 2741 on 8876  Progress: 2742 on 8876  Progress: 2743 on 8876  Progress: 2744 on 8876  Progress: 2745 on 8876  Progress: 2746 on 8876  Progress: 2747 on 8876  Progress: 2748 on 8876  Progress: 2749 on 8876  Progress: 2750 on 8876  Progress: 2751 on 8876  Progress: 2752 on 8876  Progress: 2753 on 8876  Progress: 2754 on 8876  Progress: 2755 on 8876  Progress: 2756 on 8876  Progress: 2757 on 8876  Progress: 2758 on 8876  Progress: 2759 on 8876  Progress: 2760 on 8876  Progress: 2761 on 8876  Progress: 2762 on 8876  Progress: 2763 on 8876  Progress: 2764 on 8876  Progress: 2765 on 8876  Progress: 2766 on 8876  Progress: 2767 on 8876  Progress: 2768 on 8876  Progress: 2769 on 8876  Progress: 2770 on 8876  Progress: 2771 on 8876  Progress: 2772 on 8876  Progress: 2773 on 8876  Progress: 2774 on 8876  Progress: 2775 on 8876  Progress: 2776 on 8876  Progress: 2777 on 8876  Progress: 2778 on 8876  Progress: 2779 on 8876  Progress: 2780 on 8876  Progress: 2781 on 8876  Progress: 2782 on 8876  Progress: 2783 on 8876  Progress: 2784 on 8876  Progress: 2785 on 8876  Progress: 2786 on 8876  Progress: 2787 on 8876  Progress: 2788 on 8876  Progress: 2789 on 8876  Progress: 2790 on 8876  Progress: 2791 on 8876  Progress: 2792 on 8876  Progress: 2793 on 8876  Progress: 2794 on 8876  Progress: 2795 on 8876  Progress: 2796 on 8876  Progress: 2797 on 8876  Progress: 2798 on 8876  Progress: 2799 on 8876  Progress: 2800 on 8876  Progress: 2801 on 8876  Progress: 2802 on 8876  Progress: 2803 on 8876  Progress: 2804 on 8876  Progress: 2805 on 8876  Progress: 2806 on 8876  Progress: 2807 on 8876  Progress: 2808 on 8876  Progress: 2809 on 8876  Progress: 2810 on 8876  Progress: 2811 on 8876  Progress: 2812 on 8876  Progress: 2813 on 8876  Progress: 2814 on 8876  Progress: 2815 on 8876  Progress: 2816 on 8876  Progress: 2817 on 8876  Progress: 2818 on 8876  Progress: 2819 on 8876  Progress: 2820 on 8876  Progress: 2821 on 8876  Progress: 2822 on 8876  Progress: 2823 on 8876  Progress: 2824 on 8876  Progress: 2825 on 8876  Progress: 2826 on 8876  Progress: 2827 on 8876  Progress: 2828 on 8876  Progress: 2829 on 8876  Progress: 2830 on 8876  Progress: 2831 on 8876  Progress: 2832 on 8876  Progress: 2833 on 8876  Progress: 2834 on 8876  Progress: 2835 on 8876  Progress: 2836 on 8876  Progress: 2837 on 8876  Progress: 2838 on 8876  Progress: 2839 on 8876  Progress: 2840 on 8876  Progress: 2841 on 8876  Progress: 2842 on 8876  Progress: 2843 on 8876  Progress: 2844 on 8876  Progress: 2845 on 8876  Progress: 2846 on 8876  Progress: 2847 on 8876  Progress: 2848 on 8876  Progress: 2849 on 8876  Progress: 2850 on 8876  Progress: 2851 on 8876  Progress: 2852 on 8876  Progress: 2853 on 8876  Progress: 2854 on 8876  Progress: 2855 on 8876  Progress: 2856 on 8876  Progress: 2857 on 8876  Progress: 2858 on 8876  Progress: 2859 on 8876  Progress: 2860 on 8876  Progress: 2861 on 8876  Progress: 2862 on 8876  Progress: 2863 on 8876  Progress: 2864 on 8876  Progress: 2865 on 8876  Progress: 2866 on 8876  Progress: 2867 on 8876  Progress: 2868 on 8876  Progress: 2869 on 8876  Progress: 2870 on 8876  Progress: 2871 on 8876  Progress: 2872 on 8876  Progress: 2873 on 8876  Progress: 2874 on 8876  Progress: 2875 on 8876  Progress: 2876 on 8876  Progress: 2877 on 8876  Progress: 2878 on 8876  Progress: 2879 on 8876  Progress: 2880 on 8876  Progress: 2881 on 8876  Progress: 2882 on 8876  Progress: 2883 on 8876  Progress: 2884 on 8876  Progress: 2885 on 8876  Progress: 2886 on 8876  Progress: 2887 on 8876  Progress: 2888 on 8876  Progress: 2889 on 8876  Progress: 2890 on 8876  Progress: 2891 on 8876  Progress: 2892 on 8876  Progress: 2893 on 8876  Progress: 2894 on 8876  Progress: 2895 on 8876  Progress: 2896 on 8876  Progress: 2897 on 8876  Progress: 2898 on 8876  Progress: 2899 on 8876  Progress: 2900 on 8876  Progress: 2901 on 8876  Progress: 2902 on 8876  Progress: 2903 on 8876  Progress: 2904 on 8876  Progress: 2905 on 8876  Progress: 2906 on 8876  Progress: 2907 on 8876  Progress: 2908 on 8876  Progress: 2909 on 8876  Progress: 2910 on 8876  Progress: 2911 on 8876  Progress: 2912 on 8876  Progress: 2913 on 8876  Progress: 2914 on 8876  Progress: 2915 on 8876  Progress: 2916 on 8876  Progress: 2917 on 8876  Progress: 2918 on 8876  Progress: 2919 on 8876  Progress: 2920 on 8876  Progress: 2921 on 8876  Progress: 2922 on 8876  Progress: 2923 on 8876  Progress: 2924 on 8876  Progress: 2925 on 8876  Progress: 2926 on 8876  Progress: 2927 on 8876  Progress: 2928 on 8876  Progress: 2929 on 8876  Progress: 2930 on 8876  Progress: 2931 on 8876  Progress: 2932 on 8876  Progress: 2933 on 8876  Progress: 2934 on 8876  Progress: 2935 on 8876  Progress: 2936 on 8876  Progress: 2937 on 8876  Progress: 2938 on 8876  Progress: 2939 on 8876  Progress: 2940 on 8876  Progress: 2941 on 8876  Progress: 2942 on 8876  Progress: 2943 on 8876  Progress: 2944 on 8876  Progress: 2945 on 8876  Progress: 2946 on 8876  Progress: 2947 on 8876  Progress: 2948 on 8876  Progress: 2949 on 8876  Progress: 2950 on 8876  Progress: 2951 on 8876  Progress: 2952 on 8876  Progress: 2953 on 8876  Progress: 2954 on 8876  Progress: 2955 on 8876  Progress: 2956 on 8876  Progress: 2957 on 8876  Progress: 2958 on 8876  Progress: 2959 on 8876  Progress: 2960 on 8876  Progress: 2961 on 8876  Progress: 2962 on 8876  Progress: 2963 on 8876  Progress: 2964 on 8876  Progress: 2965 on 8876  Progress: 2966 on 8876  Progress: 2967 on 8876  Progress: 2968 on 8876  Progress: 2969 on 8876  Progress: 2970 on 8876  Progress: 2971 on 8876  Progress: 2972 on 8876  Progress: 2973 on 8876  Progress: 2974 on 8876  Progress: 2975 on 8876  Progress: 2976 on 8876  Progress: 2977 on 8876  Progress: 2978 on 8876  Progress: 2979 on 8876  Progress: 2980 on 8876  Progress: 2981 on 8876  Progress: 2982 on 8876  Progress: 2983 on 8876  Progress: 2984 on 8876  Progress: 2985 on 8876  Progress: 2986 on 8876  Progress: 2987 on 8876  Progress: 2988 on 8876  Progress: 2989 on 8876  Progress: 2990 on 8876  Progress: 2991 on 8876  Progress: 2992 on 8876  Progress: 2993 on 8876  Progress: 2994 on 8876  Progress: 2995 on 8876  Progress: 2996 on 8876  Progress: 2997 on 8876  Progress: 2998 on 8876  Progress: 2999 on 8876  Progress: 3000 on 8876  Progress: 3001 on 8876  Progress: 3002 on 8876  Progress: 3003 on 8876  Progress: 3004 on 8876  Progress: 3005 on 8876  Progress: 3006 on 8876  Progress: 3007 on 8876  Progress: 3008 on 8876  Progress: 3009 on 8876  Progress: 3010 on 8876  Progress: 3011 on 8876  Progress: 3012 on 8876  Progress: 3013 on 8876  Progress: 3014 on 8876  Progress: 3015 on 8876  Progress: 3016 on 8876  Progress: 3017 on 8876  Progress: 3018 on 8876  Progress: 3019 on 8876  Progress: 3020 on 8876  Progress: 3021 on 8876  Progress: 3022 on 8876  Progress: 3023 on 8876  Progress: 3024 on 8876  Progress: 3025 on 8876  Progress: 3026 on 8876  Progress: 3027 on 8876  Progress: 3028 on 8876  Progress: 3029 on 8876  Progress: 3030 on 8876  Progress: 3031 on 8876  Progress: 3032 on 8876  Progress: 3033 on 8876  Progress: 3034 on 8876  Progress: 3035 on 8876  Progress: 3036 on 8876  Progress: 3037 on 8876  Progress: 3038 on 8876  Progress: 3039 on 8876  Progress: 3040 on 8876  Progress: 3041 on 8876  Progress: 3042 on 8876  Progress: 3043 on 8876  Progress: 3044 on 8876  Progress: 3045 on 8876  Progress: 3046 on 8876  Progress: 3047 on 8876  Progress: 3048 on 8876  Progress: 3049 on 8876  Progress: 3050 on 8876  Progress: 3051 on 8876  Progress: 3052 on 8876  Progress: 3053 on 8876  Progress: 3054 on 8876  Progress: 3055 on 8876  Progress: 3056 on 8876  Progress: 3057 on 8876  Progress: 3058 on 8876  Progress: 3059 on 8876  Progress: 3060 on 8876  Progress: 3061 on 8876  Progress: 3062 on 8876  Progress: 3063 on 8876  Progress: 3064 on 8876  Progress: 3065 on 8876  Progress: 3066 on 8876  Progress: 3067 on 8876  Progress: 3068 on 8876  Progress: 3069 on 8876  Progress: 3070 on 8876  Progress: 3071 on 8876  Progress: 3072 on 8876  Progress: 3073 on 8876  Progress: 3074 on 8876  Progress: 3075 on 8876  Progress: 3076 on 8876  Progress: 3077 on 8876  Progress: 3078 on 8876  Progress: 3079 on 8876  Progress: 3080 on 8876  Progress: 3081 on 8876  Progress: 3082 on 8876  Progress: 3083 on 8876  Progress: 3084 on 8876  Progress: 3085 on 8876  Progress: 3086 on 8876  Progress: 3087 on 8876  Progress: 3088 on 8876  Progress: 3089 on 8876  Progress: 3090 on 8876  Progress: 3091 on 8876  Progress: 3092 on 8876  Progress: 3093 on 8876  Progress: 3094 on 8876  Progress: 3095 on 8876  Progress: 3096 on 8876  Progress: 3097 on 8876  Progress: 3098 on 8876  Progress: 3099 on 8876  Progress: 3100 on 8876  Progress: 3101 on 8876  Progress: 3102 on 8876  Progress: 3103 on 8876  Progress: 3104 on 8876  Progress: 3105 on 8876  Progress: 3106 on 8876  Progress: 3107 on 8876  Progress: 3108 on 8876  Progress: 3109 on 8876  Progress: 3110 on 8876  Progress: 3111 on 8876  Progress: 3112 on 8876  Progress: 3113 on 8876  Progress: 3114 on 8876  Progress: 3115 on 8876  Progress: 3116 on 8876  Progress: 3117 on 8876  Progress: 3118 on 8876  Progress: 3119 on 8876  Progress: 3120 on 8876  Progress: 3121 on 8876  Progress: 3122 on 8876  Progress: 3123 on 8876  Progress: 3124 on 8876  Progress: 3125 on 8876  Progress: 3126 on 8876  Progress: 3127 on 8876  Progress: 3128 on 8876  Progress: 3129 on 8876  Progress: 3130 on 8876  Progress: 3131 on 8876  Progress: 3132 on 8876  Progress: 3133 on 8876  Progress: 3134 on 8876  Progress: 3135 on 8876  Progress: 3136 on 8876  Progress: 3137 on 8876  Progress: 3138 on 8876  Progress: 3139 on 8876  Progress: 3140 on 8876  Progress: 3141 on 8876  Progress: 3142 on 8876  Progress: 3143 on 8876  Progress: 3144 on 8876  Progress: 3145 on 8876  Progress: 3146 on 8876  Progress: 3147 on 8876  Progress: 3148 on 8876  Progress: 3149 on 8876  Progress: 3150 on 8876  Progress: 3151 on 8876  Progress: 3152 on 8876  Progress: 3153 on 8876  Progress: 3154 on 8876  Progress: 3155 on 8876  Progress: 3156 on 8876  Progress: 3157 on 8876  Progress: 3158 on 8876  Progress: 3159 on 8876  Progress: 3160 on 8876  Progress: 3161 on 8876  Progress: 3162 on 8876  Progress: 3163 on 8876  Progress: 3164 on 8876  Progress: 3165 on 8876  Progress: 3166 on 8876  Progress: 3167 on 8876  Progress: 3168 on 8876  Progress: 3169 on 8876  Progress: 3170 on 8876  Progress: 3171 on 8876  Progress: 3172 on 8876  Progress: 3173 on 8876  Progress: 3174 on 8876  Progress: 3175 on 8876  Progress: 3176 on 8876  Progress: 3177 on 8876  Progress: 3178 on 8876  Progress: 3179 on 8876  Progress: 3180 on 8876  Progress: 3181 on 8876  Progress: 3182 on 8876  Progress: 3183 on 8876  Progress: 3184 on 8876  Progress: 3185 on 8876  Progress: 3186 on 8876  Progress: 3187 on 8876  Progress: 3188 on 8876  Progress: 3189 on 8876  Progress: 3190 on 8876  Progress: 3191 on 8876  Progress: 3192 on 8876  Progress: 3193 on 8876  Progress: 3194 on 8876  Progress: 3195 on 8876  Progress: 3196 on 8876  Progress: 3197 on 8876  Progress: 3198 on 8876  Progress: 3199 on 8876  Progress: 3200 on 8876  Progress: 3201 on 8876  Progress: 3202 on 8876  Progress: 3203 on 8876  Progress: 3204 on 8876  Progress: 3205 on 8876  Progress: 3206 on 8876  Progress: 3207 on 8876  Progress: 3208 on 8876  Progress: 3209 on 8876  Progress: 3210 on 8876  Progress: 3211 on 8876  Progress: 3212 on 8876  Progress: 3213 on 8876  Progress: 3214 on 8876  Progress: 3215 on 8876  Progress: 3216 on 8876  Progress: 3217 on 8876  Progress: 3218 on 8876  Progress: 3219 on 8876  Progress: 3220 on 8876  Progress: 3221 on 8876  Progress: 3222 on 8876  Progress: 3223 on 8876  Progress: 3224 on 8876  Progress: 3225 on 8876  Progress: 3226 on 8876  Progress: 3227 on 8876  Progress: 3228 on 8876  Progress: 3229 on 8876  Progress: 3230 on 8876  Progress: 3231 on 8876  Progress: 3232 on 8876  Progress: 3233 on 8876  Progress: 3234 on 8876  Progress: 3235 on 8876  Progress: 3236 on 8876  Progress: 3237 on 8876  Progress: 3238 on 8876  Progress: 3239 on 8876  Progress: 3240 on 8876  Progress: 3241 on 8876  Progress: 3242 on 8876  Progress: 3243 on 8876  Progress: 3244 on 8876  Progress: 3245 on 8876  Progress: 3246 on 8876  Progress: 3247 on 8876  Progress: 3248 on 8876  Progress: 3249 on 8876  Progress: 3250 on 8876  Progress: 3251 on 8876  Progress: 3252 on 8876  Progress: 3253 on 8876  Progress: 3254 on 8876  Progress: 3255 on 8876  Progress: 3256 on 8876  Progress: 3257 on 8876  Progress: 3258 on 8876  Progress: 3259 on 8876  Progress: 3260 on 8876  Progress: 3261 on 8876  Progress: 3262 on 8876  Progress: 3263 on 8876  Progress: 3264 on 8876  Progress: 3265 on 8876  Progress: 3266 on 8876  Progress: 3267 on 8876  Progress: 3268 on 8876  Progress: 3269 on 8876  Progress: 3270 on 8876  Progress: 3271 on 8876  Progress: 3272 on 8876  Progress: 3273 on 8876  Progress: 3274 on 8876  Progress: 3275 on 8876  Progress: 3276 on 8876  Progress: 3277 on 8876  Progress: 3278 on 8876  Progress: 3279 on 8876  Progress: 3280 on 8876  Progress: 3281 on 8876  Progress: 3282 on 8876  Progress: 3283 on 8876  Progress: 3284 on 8876  Progress: 3285 on 8876  Progress: 3286 on 8876  Progress: 3287 on 8876  Progress: 3288 on 8876  Progress: 3289 on 8876  Progress: 3290 on 8876  Progress: 3291 on 8876  Progress: 3292 on 8876  Progress: 3293 on 8876  Progress: 3294 on 8876  Progress: 3295 on 8876  Progress: 3296 on 8876  Progress: 3297 on 8876  Progress: 3298 on 8876  Progress: 3299 on 8876  Progress: 3300 on 8876  Progress: 3301 on 8876  Progress: 3302 on 8876  Progress: 3303 on 8876  Progress: 3304 on 8876  Progress: 3305 on 8876  Progress: 3306 on 8876  Progress: 3307 on 8876  Progress: 3308 on 8876  Progress: 3309 on 8876  Progress: 3310 on 8876  Progress: 3311 on 8876  Progress: 3312 on 8876  Progress: 3313 on 8876  Progress: 3314 on 8876  Progress: 3315 on 8876  Progress: 3316 on 8876  Progress: 3317 on 8876  Progress: 3318 on 8876  Progress: 3319 on 8876  Progress: 3320 on 8876  Progress: 3321 on 8876  Progress: 3322 on 8876  Progress: 3323 on 8876  Progress: 3324 on 8876  Progress: 3325 on 8876  Progress: 3326 on 8876  Progress: 3327 on 8876  Progress: 3328 on 8876  Progress: 3329 on 8876  Progress: 3330 on 8876  Progress: 3331 on 8876  Progress: 3332 on 8876  Progress: 3333 on 8876  Progress: 3334 on 8876  Progress: 3335 on 8876  Progress: 3336 on 8876  Progress: 3337 on 8876  Progress: 3338 on 8876  Progress: 3339 on 8876  Progress: 3340 on 8876  Progress: 3341 on 8876  Progress: 3342 on 8876  Progress: 3343 on 8876  Progress: 3344 on 8876  Progress: 3345 on 8876  Progress: 3346 on 8876  Progress: 3347 on 8876  Progress: 3348 on 8876  Progress: 3349 on 8876  Progress: 3350 on 8876  Progress: 3351 on 8876  Progress: 3352 on 8876  Progress: 3353 on 8876  Progress: 3354 on 8876  Progress: 3355 on 8876  Progress: 3356 on 8876  Progress: 3357 on 8876  Progress: 3358 on 8876  Progress: 3359 on 8876  Progress: 3360 on 8876  Progress: 3361 on 8876  Progress: 3362 on 8876  Progress: 3363 on 8876  Progress: 3364 on 8876  Progress: 3365 on 8876  Progress: 3366 on 8876  Progress: 3367 on 8876  Progress: 3368 on 8876  Progress: 3369 on 8876  Progress: 3370 on 8876  Progress: 3371 on 8876  Progress: 3372 on 8876  Progress: 3373 on 8876  Progress: 3374 on 8876  Progress: 3375 on 8876  Progress: 3376 on 8876  Progress: 3377 on 8876  Progress: 3378 on 8876  Progress: 3379 on 8876  Progress: 3380 on 8876  Progress: 3381 on 8876  Progress: 3382 on 8876  Progress: 3383 on 8876  Progress: 3384 on 8876  Progress: 3385 on 8876  Progress: 3386 on 8876  Progress: 3387 on 8876  Progress: 3388 on 8876  Progress: 3389 on 8876  Progress: 3390 on 8876  Progress: 3391 on 8876  Progress: 3392 on 8876  Progress: 3393 on 8876  Progress: 3394 on 8876  Progress: 3395 on 8876  Progress: 3396 on 8876  Progress: 3397 on 8876  Progress: 3398 on 8876  Progress: 3399 on 8876  Progress: 3400 on 8876  Progress: 3401 on 8876  Progress: 3402 on 8876  Progress: 3403 on 8876  Progress: 3404 on 8876  Progress: 3405 on 8876  Progress: 3406 on 8876  Progress: 3407 on 8876  Progress: 3408 on 8876  Progress: 3409 on 8876  Progress: 3410 on 8876  Progress: 3411 on 8876  Progress: 3412 on 8876  Progress: 3413 on 8876  Progress: 3414 on 8876  Progress: 3415 on 8876  Progress: 3416 on 8876  Progress: 3417 on 8876  Progress: 3418 on 8876  Progress: 3419 on 8876  Progress: 3420 on 8876  Progress: 3421 on 8876  Progress: 3422 on 8876  Progress: 3423 on 8876  Progress: 3424 on 8876  Progress: 3425 on 8876  Progress: 3426 on 8876  Progress: 3427 on 8876  Progress: 3428 on 8876  Progress: 3429 on 8876  Progress: 3430 on 8876  Progress: 3431 on 8876  Progress: 3432 on 8876  Progress: 3433 on 8876  Progress: 3434 on 8876  Progress: 3435 on 8876  Progress: 3436 on 8876  Progress: 3437 on 8876  Progress: 3438 on 8876  Progress: 3439 on 8876  Progress: 3440 on 8876  Progress: 3441 on 8876  Progress: 3442 on 8876  Progress: 3443 on 8876  Progress: 3444 on 8876  Progress: 3445 on 8876  Progress: 3446 on 8876  Progress: 3447 on 8876  Progress: 3448 on 8876  Progress: 3449 on 8876  Progress: 3450 on 8876  Progress: 3451 on 8876  Progress: 3452 on 8876  Progress: 3453 on 8876  Progress: 3454 on 8876  Progress: 3455 on 8876  Progress: 3456 on 8876  Progress: 3457 on 8876  Progress: 3458 on 8876  Progress: 3459 on 8876  Progress: 3460 on 8876  Progress: 3461 on 8876  Progress: 3462 on 8876  Progress: 3463 on 8876  Progress: 3464 on 8876  Progress: 3465 on 8876  Progress: 3466 on 8876  Progress: 3467 on 8876  Progress: 3468 on 8876  Progress: 3469 on 8876  Progress: 3470 on 8876  Progress: 3471 on 8876  Progress: 3472 on 8876  Progress: 3473 on 8876  Progress: 3474 on 8876  Progress: 3475 on 8876  Progress: 3476 on 8876  Progress: 3477 on 8876  Progress: 3478 on 8876  Progress: 3479 on 8876  Progress: 3480 on 8876  Progress: 3481 on 8876  Progress: 3482 on 8876  Progress: 3483 on 8876  Progress: 3484 on 8876  Progress: 3485 on 8876  Progress: 3486 on 8876  Progress: 3487 on 8876  Progress: 3488 on 8876  Progress: 3489 on 8876  Progress: 3490 on 8876  Progress: 3491 on 8876  Progress: 3492 on 8876  Progress: 3493 on 8876  Progress: 3494 on 8876  Progress: 3495 on 8876  Progress: 3496 on 8876  Progress: 3497 on 8876  Progress: 3498 on 8876  Progress: 3499 on 8876  Progress: 3500 on 8876  Progress: 3501 on 8876  Progress: 3502 on 8876  Progress: 3503 on 8876  Progress: 3504 on 8876  Progress: 3505 on 8876  Progress: 3506 on 8876  Progress: 3507 on 8876  Progress: 3508 on 8876  Progress: 3509 on 8876  Progress: 3510 on 8876  Progress: 3511 on 8876  Progress: 3512 on 8876  Progress: 3513 on 8876  Progress: 3514 on 8876  Progress: 3515 on 8876  Progress: 3516 on 8876  Progress: 3517 on 8876  Progress: 3518 on 8876  Progress: 3519 on 8876  Progress: 3520 on 8876  Progress: 3521 on 8876  Progress: 3522 on 8876  Progress: 3523 on 8876  Progress: 3524 on 8876  Progress: 3525 on 8876  Progress: 3526 on 8876  Progress: 3527 on 8876  Progress: 3528 on 8876  Progress: 3529 on 8876  Progress: 3530 on 8876  Progress: 3531 on 8876  Progress: 3532 on 8876  Progress: 3533 on 8876  Progress: 3534 on 8876  Progress: 3535 on 8876  Progress: 3536 on 8876  Progress: 3537 on 8876  Progress: 3538 on 8876  Progress: 3539 on 8876  Progress: 3540 on 8876  Progress: 3541 on 8876  Progress: 3542 on 8876  Progress: 3543 on 8876  Progress: 3544 on 8876  Progress: 3545 on 8876  Progress: 3546 on 8876  Progress: 3547 on 8876  Progress: 3548 on 8876  Progress: 3549 on 8876  Progress: 3550 on 8876  Progress: 3551 on 8876  Progress: 3552 on 8876  Progress: 3553 on 8876  Progress: 3554 on 8876  Progress: 3555 on 8876  Progress: 3556 on 8876  Progress: 3557 on 8876  Progress: 3558 on 8876  Progress: 3559 on 8876  Progress: 3560 on 8876  Progress: 3561 on 8876  Progress: 3562 on 8876  Progress: 3563 on 8876  Progress: 3564 on 8876  Progress: 3565 on 8876  Progress: 3566 on 8876  Progress: 3567 on 8876  Progress: 3568 on 8876  Progress: 3569 on 8876  Progress: 3570 on 8876  Progress: 3571 on 8876  Progress: 3572 on 8876  Progress: 3573 on 8876  Progress: 3574 on 8876  Progress: 3575 on 8876  Progress: 3576 on 8876  Progress: 3577 on 8876  Progress: 3578 on 8876  Progress: 3579 on 8876  Progress: 3580 on 8876  Progress: 3581 on 8876  Progress: 3582 on 8876  Progress: 3583 on 8876  Progress: 3584 on 8876  Progress: 3585 on 8876  Progress: 3586 on 8876  Progress: 3587 on 8876  Progress: 3588 on 8876  Progress: 3589 on 8876  Progress: 3590 on 8876  Progress: 3591 on 8876  Progress: 3592 on 8876  Progress: 3593 on 8876  Progress: 3594 on 8876  Progress: 3595 on 8876  Progress: 3596 on 8876  Progress: 3597 on 8876  Progress: 3598 on 8876  Progress: 3599 on 8876  Progress: 3600 on 8876  Progress: 3601 on 8876  Progress: 3602 on 8876  Progress: 3603 on 8876  Progress: 3604 on 8876  Progress: 3605 on 8876  Progress: 3606 on 8876  Progress: 3607 on 8876  Progress: 3608 on 8876  Progress: 3609 on 8876  Progress: 3610 on 8876  Progress: 3611 on 8876  Progress: 3612 on 8876  Progress: 3613 on 8876  Progress: 3614 on 8876  Progress: 3615 on 8876  Progress: 3616 on 8876  Progress: 3617 on 8876  Progress: 3618 on 8876  Progress: 3619 on 8876  Progress: 3620 on 8876  Progress: 3621 on 8876  Progress: 3622 on 8876  Progress: 3623 on 8876  Progress: 3624 on 8876  Progress: 3625 on 8876  Progress: 3626 on 8876  Progress: 3627 on 8876  Progress: 3628 on 8876  Progress: 3629 on 8876  Progress: 3630 on 8876  Progress: 3631 on 8876  Progress: 3632 on 8876  Progress: 3633 on 8876  Progress: 3634 on 8876  Progress: 3635 on 8876  Progress: 3636 on 8876  Progress: 3637 on 8876  Progress: 3638 on 8876  Progress: 3639 on 8876  Progress: 3640 on 8876  Progress: 3641 on 8876  Progress: 3642 on 8876  Progress: 3643 on 8876  Progress: 3644 on 8876  Progress: 3645 on 8876  Progress: 3646 on 8876  Progress: 3647 on 8876  Progress: 3648 on 8876  Progress: 3649 on 8876  Progress: 3650 on 8876  Progress: 3651 on 8876  Progress: 3652 on 8876  Progress: 3653 on 8876  Progress: 3654 on 8876  Progress: 3655 on 8876  Progress: 3656 on 8876  Progress: 3657 on 8876  Progress: 3658 on 8876  Progress: 3659 on 8876  Progress: 3660 on 8876  Progress: 3661 on 8876  Progress: 3662 on 8876  Progress: 3663 on 8876  Progress: 3664 on 8876  Progress: 3665 on 8876  Progress: 3666 on 8876  Progress: 3667 on 8876  Progress: 3668 on 8876  Progress: 3669 on 8876  Progress: 3670 on 8876  Progress: 3671 on 8876  Progress: 3672 on 8876  Progress: 3673 on 8876  Progress: 3674 on 8876  Progress: 3675 on 8876  Progress: 3676 on 8876  Progress: 3677 on 8876  Progress: 3678 on 8876  Progress: 3679 on 8876  Progress: 3680 on 8876  Progress: 3681 on 8876  Progress: 3682 on 8876  Progress: 3683 on 8876  Progress: 3684 on 8876  Progress: 3685 on 8876  Progress: 3686 on 8876  Progress: 3687 on 8876  Progress: 3688 on 8876  Progress: 3689 on 8876  Progress: 3690 on 8876  Progress: 3691 on 8876  Progress: 3692 on 8876  Progress: 3693 on 8876  Progress: 3694 on 8876  Progress: 3695 on 8876  Progress: 3696 on 8876  Progress: 3697 on 8876  Progress: 3698 on 8876  Progress: 3699 on 8876  Progress: 3700 on 8876  Progress: 3701 on 8876  Progress: 3702 on 8876  Progress: 3703 on 8876  Progress: 3704 on 8876  Progress: 3705 on 8876  Progress: 3706 on 8876  Progress: 3707 on 8876  Progress: 3708 on 8876  Progress: 3709 on 8876  Progress: 3710 on 8876  Progress: 3711 on 8876  Progress: 3712 on 8876  Progress: 3713 on 8876  Progress: 3714 on 8876  Progress: 3715 on 8876  Progress: 3716 on 8876  Progress: 3717 on 8876  Progress: 3718 on 8876  Progress: 3719 on 8876  Progress: 3720 on 8876  Progress: 3721 on 8876  Progress: 3722 on 8876  Progress: 3723 on 8876  Progress: 3724 on 8876  Progress: 3725 on 8876  Progress: 3726 on 8876  Progress: 3727 on 8876  Progress: 3728 on 8876  Progress: 3729 on 8876  Progress: 3730 on 8876  Progress: 3731 on 8876  Progress: 3732 on 8876  Progress: 3733 on 8876  Progress: 3734 on 8876  Progress: 3735 on 8876  Progress: 3736 on 8876  Progress: 3737 on 8876  Progress: 3738 on 8876  Progress: 3739 on 8876  Progress: 3740 on 8876  Progress: 3741 on 8876  Progress: 3742 on 8876  Progress: 3743 on 8876  Progress: 3744 on 8876  Progress: 3745 on 8876  Progress: 3746 on 8876  Progress: 3747 on 8876  Progress: 3748 on 8876  Progress: 3749 on 8876  Progress: 3750 on 8876  Progress: 3751 on 8876  Progress: 3752 on 8876  Progress: 3753 on 8876  Progress: 3754 on 8876  Progress: 3755 on 8876  Progress: 3756 on 8876  Progress: 3757 on 8876  Progress: 3758 on 8876  Progress: 3759 on 8876  Progress: 3760 on 8876  Progress: 3761 on 8876  Progress: 3762 on 8876  Progress: 3763 on 8876  Progress: 3764 on 8876  Progress: 3765 on 8876  Progress: 3766 on 8876  Progress: 3767 on 8876  Progress: 3768 on 8876  Progress: 3769 on 8876  Progress: 3770 on 8876  Progress: 3771 on 8876  Progress: 3772 on 8876  Progress: 3773 on 8876  Progress: 3774 on 8876  Progress: 3775 on 8876  Progress: 3776 on 8876  Progress: 3777 on 8876  Progress: 3778 on 8876  Progress: 3779 on 8876  Progress: 3780 on 8876  Progress: 3781 on 8876  Progress: 3782 on 8876  Progress: 3783 on 8876  Progress: 3784 on 8876  Progress: 3785 on 8876  Progress: 3786 on 8876  Progress: 3787 on 8876  Progress: 3788 on 8876  Progress: 3789 on 8876  Progress: 3790 on 8876  Progress: 3791 on 8876  Progress: 3792 on 8876  Progress: 3793 on 8876  Progress: 3794 on 8876  Progress: 3795 on 8876  Progress: 3796 on 8876  Progress: 3797 on 8876  Progress: 3798 on 8876  Progress: 3799 on 8876  Progress: 3800 on 8876  Progress: 3801 on 8876  Progress: 3802 on 8876  Progress: 3803 on 8876  Progress: 3804 on 8876  Progress: 3805 on 8876  Progress: 3806 on 8876  Progress: 3807 on 8876  Progress: 3808 on 8876  Progress: 3809 on 8876  Progress: 3810 on 8876  Progress: 3811 on 8876  Progress: 3812 on 8876  Progress: 3813 on 8876  Progress: 3814 on 8876  Progress: 3815 on 8876  Progress: 3816 on 8876  Progress: 3817 on 8876  Progress: 3818 on 8876  Progress: 3819 on 8876  Progress: 3820 on 8876  Progress: 3821 on 8876  Progress: 3822 on 8876  Progress: 3823 on 8876  Progress: 3824 on 8876  Progress: 3825 on 8876  Progress: 3826 on 8876  Progress: 3827 on 8876  Progress: 3828 on 8876  Progress: 3829 on 8876  Progress: 3830 on 8876  Progress: 3831 on 8876  Progress: 3832 on 8876  Progress: 3833 on 8876  Progress: 3834 on 8876  Progress: 3835 on 8876  Progress: 3836 on 8876  Progress: 3837 on 8876  Progress: 3838 on 8876  Progress: 3839 on 8876  Progress: 3840 on 8876  Progress: 3841 on 8876  Progress: 3842 on 8876  Progress: 3843 on 8876  Progress: 3844 on 8876  Progress: 3845 on 8876  Progress: 3846 on 8876  Progress: 3847 on 8876  Progress: 3848 on 8876  Progress: 3849 on 8876  Progress: 3850 on 8876  Progress: 3851 on 8876  Progress: 3852 on 8876  Progress: 3853 on 8876  Progress: 3854 on 8876  Progress: 3855 on 8876  Progress: 3856 on 8876  Progress: 3857 on 8876  Progress: 3858 on 8876  Progress: 3859 on 8876  Progress: 3860 on 8876  Progress: 3861 on 8876  Progress: 3862 on 8876  Progress: 3863 on 8876  Progress: 3864 on 8876  Progress: 3865 on 8876  Progress: 3866 on 8876  Progress: 3867 on 8876  Progress: 3868 on 8876  Progress: 3869 on 8876  Progress: 3870 on 8876  Progress: 3871 on 8876  Progress: 3872 on 8876  Progress: 3873 on 8876  Progress: 3874 on 8876  Progress: 3875 on 8876  Progress: 3876 on 8876  Progress: 3877 on 8876  Progress: 3878 on 8876  Progress: 3879 on 8876  Progress: 3880 on 8876  Progress: 3881 on 8876  Progress: 3882 on 8876  Progress: 3883 on 8876  Progress: 3884 on 8876  Progress: 3885 on 8876  Progress: 3886 on 8876  Progress: 3887 on 8876  Progress: 3888 on 8876  Progress: 3889 on 8876  Progress: 3890 on 8876  Progress: 3891 on 8876  Progress: 3892 on 8876  Progress: 3893 on 8876  Progress: 3894 on 8876  Progress: 3895 on 8876  Progress: 3896 on 8876  Progress: 3897 on 8876  Progress: 3898 on 8876  Progress: 3899 on 8876  Progress: 3900 on 8876  Progress: 3901 on 8876  Progress: 3902 on 8876  Progress: 3903 on 8876  Progress: 3904 on 8876  Progress: 3905 on 8876  Progress: 3906 on 8876  Progress: 3907 on 8876  Progress: 3908 on 8876  Progress: 3909 on 8876  Progress: 3910 on 8876  Progress: 3911 on 8876  Progress: 3912 on 8876  Progress: 3913 on 8876  Progress: 3914 on 8876  Progress: 3915 on 8876  Progress: 3916 on 8876  Progress: 3917 on 8876  Progress: 3918 on 8876  Progress: 3919 on 8876  Progress: 3920 on 8876  Progress: 3921 on 8876  Progress: 3922 on 8876  Progress: 3923 on 8876  Progress: 3924 on 8876  Progress: 3925 on 8876  Progress: 3926 on 8876  Progress: 3927 on 8876  Progress: 3928 on 8876  Progress: 3929 on 8876  Progress: 3930 on 8876  Progress: 3931 on 8876  Progress: 3932 on 8876  Progress: 3933 on 8876  Progress: 3934 on 8876  Progress: 3935 on 8876  Progress: 3936 on 8876  Progress: 3937 on 8876  Progress: 3938 on 8876  Progress: 3939 on 8876  Progress: 3940 on 8876  Progress: 3941 on 8876  Progress: 3942 on 8876  Progress: 3943 on 8876  Progress: 3944 on 8876  Progress: 3945 on 8876  Progress: 3946 on 8876  Progress: 3947 on 8876  Progress: 3948 on 8876  Progress: 3949 on 8876  Progress: 3950 on 8876  Progress: 3951 on 8876  Progress: 3952 on 8876  Progress: 3953 on 8876  Progress: 3954 on 8876  Progress: 3955 on 8876  Progress: 3956 on 8876  Progress: 3957 on 8876  Progress: 3958 on 8876  Progress: 3959 on 8876  Progress: 3960 on 8876  Progress: 3961 on 8876  Progress: 3962 on 8876  Progress: 3963 on 8876  Progress: 3964 on 8876  Progress: 3965 on 8876  Progress: 3966 on 8876  Progress: 3967 on 8876  Progress: 3968 on 8876  Progress: 3969 on 8876  Progress: 3970 on 8876  Progress: 3971 on 8876  Progress: 3972 on 8876  Progress: 3973 on 8876  Progress: 3974 on 8876  Progress: 3975 on 8876  Progress: 3976 on 8876  Progress: 3977 on 8876  Progress: 3978 on 8876  Progress: 3979 on 8876  Progress: 3980 on 8876  Progress: 3981 on 8876  Progress: 3982 on 8876  Progress: 3983 on 8876  Progress: 3984 on 8876  Progress: 3985 on 8876  Progress: 3986 on 8876  Progress: 3987 on 8876  Progress: 3988 on 8876  Progress: 3989 on 8876  Progress: 3990 on 8876  Progress: 3991 on 8876  Progress: 3992 on 8876  Progress: 3993 on 8876  Progress: 3994 on 8876  Progress: 3995 on 8876  Progress: 3996 on 8876  Progress: 3997 on 8876  Progress: 3998 on 8876  Progress: 3999 on 8876  Progress: 4000 on 8876  Progress: 4001 on 8876  Progress: 4002 on 8876  Progress: 4003 on 8876  Progress: 4004 on 8876  Progress: 4005 on 8876  Progress: 4006 on 8876  Progress: 4007 on 8876  Progress: 4008 on 8876  Progress: 4009 on 8876  Progress: 4010 on 8876  Progress: 4011 on 8876  Progress: 4012 on 8876  Progress: 4013 on 8876  Progress: 4014 on 8876  Progress: 4015 on 8876  Progress: 4016 on 8876  Progress: 4017 on 8876  Progress: 4018 on 8876  Progress: 4019 on 8876  Progress: 4020 on 8876  Progress: 4021 on 8876  Progress: 4022 on 8876  Progress: 4023 on 8876  Progress: 4024 on 8876  Progress: 4025 on 8876  Progress: 4026 on 8876  Progress: 4027 on 8876  Progress: 4028 on 8876  Progress: 4029 on 8876  Progress: 4030 on 8876  Progress: 4031 on 8876  Progress: 4032 on 8876  Progress: 4033 on 8876  Progress: 4034 on 8876  Progress: 4035 on 8876  Progress: 4036 on 8876  Progress: 4037 on 8876  Progress: 4038 on 8876  Progress: 4039 on 8876  Progress: 4040 on 8876  Progress: 4041 on 8876  Progress: 4042 on 8876  Progress: 4043 on 8876  Progress: 4044 on 8876  Progress: 4045 on 8876  Progress: 4046 on 8876  Progress: 4047 on 8876  Progress: 4048 on 8876  Progress: 4049 on 8876  Progress: 4050 on 8876  Progress: 4051 on 8876  Progress: 4052 on 8876  Progress: 4053 on 8876  Progress: 4054 on 8876  Progress: 4055 on 8876  Progress: 4056 on 8876  Progress: 4057 on 8876  Progress: 4058 on 8876  Progress: 4059 on 8876  Progress: 4060 on 8876  Progress: 4061 on 8876  Progress: 4062 on 8876  Progress: 4063 on 8876  Progress: 4064 on 8876  Progress: 4065 on 8876  Progress: 4066 on 8876  Progress: 4067 on 8876  Progress: 4068 on 8876  Progress: 4069 on 8876  Progress: 4070 on 8876  Progress: 4071 on 8876  Progress: 4072 on 8876  Progress: 4073 on 8876  Progress: 4074 on 8876  Progress: 4075 on 8876  Progress: 4076 on 8876  Progress: 4077 on 8876  Progress: 4078 on 8876  Progress: 4079 on 8876  Progress: 4080 on 8876  Progress: 4081 on 8876  Progress: 4082 on 8876  Progress: 4083 on 8876  Progress: 4084 on 8876  Progress: 4085 on 8876  Progress: 4086 on 8876  Progress: 4087 on 8876  Progress: 4088 on 8876  Progress: 4089 on 8876  Progress: 4090 on 8876  Progress: 4091 on 8876  Progress: 4092 on 8876  Progress: 4093 on 8876  Progress: 4094 on 8876  Progress: 4095 on 8876  Progress: 4096 on 8876  Progress: 4097 on 8876  Progress: 4098 on 8876  Progress: 4099 on 8876  Progress: 4100 on 8876  Progress: 4101 on 8876  Progress: 4102 on 8876  Progress: 4103 on 8876  Progress: 4104 on 8876  Progress: 4105 on 8876  Progress: 4106 on 8876  Progress: 4107 on 8876  Progress: 4108 on 8876  Progress: 4109 on 8876  Progress: 4110 on 8876  Progress: 4111 on 8876  Progress: 4112 on 8876  Progress: 4113 on 8876  Progress: 4114 on 8876  Progress: 4115 on 8876  Progress: 4116 on 8876  Progress: 4117 on 8876  Progress: 4118 on 8876  Progress: 4119 on 8876  Progress: 4120 on 8876  Progress: 4121 on 8876  Progress: 4122 on 8876  Progress: 4123 on 8876  Progress: 4124 on 8876  Progress: 4125 on 8876  Progress: 4126 on 8876  Progress: 4127 on 8876  Progress: 4128 on 8876  Progress: 4129 on 8876  Progress: 4130 on 8876  Progress: 4131 on 8876  Progress: 4132 on 8876  Progress: 4133 on 8876  Progress: 4134 on 8876  Progress: 4135 on 8876  Progress: 4136 on 8876  Progress: 4137 on 8876  Progress: 4138 on 8876  Progress: 4139 on 8876  Progress: 4140 on 8876  Progress: 4141 on 8876  Progress: 4142 on 8876  Progress: 4143 on 8876  Progress: 4144 on 8876  Progress: 4145 on 8876  Progress: 4146 on 8876  Progress: 4147 on 8876  Progress: 4148 on 8876  Progress: 4149 on 8876  Progress: 4150 on 8876  Progress: 4151 on 8876  Progress: 4152 on 8876  Progress: 4153 on 8876  Progress: 4154 on 8876  Progress: 4155 on 8876  Progress: 4156 on 8876  Progress: 4157 on 8876  Progress: 4158 on 8876  Progress: 4159 on 8876  Progress: 4160 on 8876  Progress: 4161 on 8876  Progress: 4162 on 8876  Progress: 4163 on 8876  Progress: 4164 on 8876  Progress: 4165 on 8876  Progress: 4166 on 8876  Progress: 4167 on 8876  Progress: 4168 on 8876  Progress: 4169 on 8876  Progress: 4170 on 8876  Progress: 4171 on 8876  Progress: 4172 on 8876  Progress: 4173 on 8876  Progress: 4174 on 8876  Progress: 4175 on 8876  Progress: 4176 on 8876  Progress: 4177 on 8876  Progress: 4178 on 8876  Progress: 4179 on 8876  Progress: 4180 on 8876  Progress: 4181 on 8876  Progress: 4182 on 8876  Progress: 4183 on 8876  Progress: 4184 on 8876  Progress: 4185 on 8876  Progress: 4186 on 8876  Progress: 4187 on 8876  Progress: 4188 on 8876  Progress: 4189 on 8876  Progress: 4190 on 8876  Progress: 4191 on 8876  Progress: 4192 on 8876  Progress: 4193 on 8876  Progress: 4194 on 8876  Progress: 4195 on 8876  Progress: 4196 on 8876  Progress: 4197 on 8876  Progress: 4198 on 8876  Progress: 4199 on 8876  Progress: 4200 on 8876  Progress: 4201 on 8876  Progress: 4202 on 8876  Progress: 4203 on 8876  Progress: 4204 on 8876  Progress: 4205 on 8876  Progress: 4206 on 8876  Progress: 4207 on 8876  Progress: 4208 on 8876  Progress: 4209 on 8876  Progress: 4210 on 8876  Progress: 4211 on 8876  Progress: 4212 on 8876  Progress: 4213 on 8876  Progress: 4214 on 8876  Progress: 4215 on 8876  Progress: 4216 on 8876  Progress: 4217 on 8876  Progress: 4218 on 8876  Progress: 4219 on 8876  Progress: 4220 on 8876  Progress: 4221 on 8876  Progress: 4222 on 8876  Progress: 4223 on 8876  Progress: 4224 on 8876  Progress: 4225 on 8876  Progress: 4226 on 8876  Progress: 4227 on 8876  Progress: 4228 on 8876  Progress: 4229 on 8876  Progress: 4230 on 8876  Progress: 4231 on 8876  Progress: 4232 on 8876  Progress: 4233 on 8876  Progress: 4234 on 8876  Progress: 4235 on 8876  Progress: 4236 on 8876  Progress: 4237 on 8876  Progress: 4238 on 8876  Progress: 4239 on 8876  Progress: 4240 on 8876  Progress: 4241 on 8876  Progress: 4242 on 8876  Progress: 4243 on 8876  Progress: 4244 on 8876  Progress: 4245 on 8876  Progress: 4246 on 8876  Progress: 4247 on 8876  Progress: 4248 on 8876  Progress: 4249 on 8876  Progress: 4250 on 8876  Progress: 4251 on 8876  Progress: 4252 on 8876  Progress: 4253 on 8876  Progress: 4254 on 8876  Progress: 4255 on 8876  Progress: 4256 on 8876  Progress: 4257 on 8876  Progress: 4258 on 8876  Progress: 4259 on 8876  Progress: 4260 on 8876  Progress: 4261 on 8876  Progress: 4262 on 8876  Progress: 4263 on 8876  Progress: 4264 on 8876  Progress: 4265 on 8876  Progress: 4266 on 8876  Progress: 4267 on 8876  Progress: 4268 on 8876  Progress: 4269 on 8876  Progress: 4270 on 8876  Progress: 4271 on 8876  Progress: 4272 on 8876  Progress: 4273 on 8876  Progress: 4274 on 8876  Progress: 4275 on 8876  Progress: 4276 on 8876  Progress: 4277 on 8876  Progress: 4278 on 8876  Progress: 4279 on 8876  Progress: 4280 on 8876  Progress: 4281 on 8876  Progress: 4282 on 8876  Progress: 4283 on 8876  Progress: 4284 on 8876  Progress: 4285 on 8876  Progress: 4286 on 8876  Progress: 4287 on 8876  Progress: 4288 on 8876  Progress: 4289 on 8876  Progress: 4290 on 8876  Progress: 4291 on 8876  Progress: 4292 on 8876  Progress: 4293 on 8876  Progress: 4294 on 8876  Progress: 4295 on 8876  Progress: 4296 on 8876  Progress: 4297 on 8876  Progress: 4298 on 8876  Progress: 4299 on 8876  Progress: 4300 on 8876  Progress: 4301 on 8876  Progress: 4302 on 8876  Progress: 4303 on 8876  Progress: 4304 on 8876  Progress: 4305 on 8876  Progress: 4306 on 8876  Progress: 4307 on 8876  Progress: 4308 on 8876  Progress: 4309 on 8876  Progress: 4310 on 8876  Progress: 4311 on 8876  Progress: 4312 on 8876  Progress: 4313 on 8876  Progress: 4314 on 8876  Progress: 4315 on 8876  Progress: 4316 on 8876  Progress: 4317 on 8876  Progress: 4318 on 8876  Progress: 4319 on 8876  Progress: 4320 on 8876  Progress: 4321 on 8876  Progress: 4322 on 8876  Progress: 4323 on 8876  Progress: 4324 on 8876  Progress: 4325 on 8876  Progress: 4326 on 8876  Progress: 4327 on 8876  Progress: 4328 on 8876  Progress: 4329 on 8876  Progress: 4330 on 8876  Progress: 4331 on 8876  Progress: 4332 on 8876  Progress: 4333 on 8876  Progress: 4334 on 8876  Progress: 4335 on 8876  Progress: 4336 on 8876  Progress: 4337 on 8876  Progress: 4338 on 8876  Progress: 4339 on 8876  Progress: 4340 on 8876  Progress: 4341 on 8876  Progress: 4342 on 8876  Progress: 4343 on 8876  Progress: 4344 on 8876  Progress: 4345 on 8876  Progress: 4346 on 8876  Progress: 4347 on 8876  Progress: 4348 on 8876  Progress: 4349 on 8876  Progress: 4350 on 8876  Progress: 4351 on 8876  Progress: 4352 on 8876  Progress: 4353 on 8876  Progress: 4354 on 8876  Progress: 4355 on 8876  Progress: 4356 on 8876  Progress: 4357 on 8876  Progress: 4358 on 8876  Progress: 4359 on 8876  Progress: 4360 on 8876  Progress: 4361 on 8876  Progress: 4362 on 8876  Progress: 4363 on 8876  Progress: 4364 on 8876  Progress: 4365 on 8876  Progress: 4366 on 8876  Progress: 4367 on 8876  Progress: 4368 on 8876  Progress: 4369 on 8876  Progress: 4370 on 8876  Progress: 4371 on 8876  Progress: 4372 on 8876  Progress: 4373 on 8876  Progress: 4374 on 8876  Progress: 4375 on 8876  Progress: 4376 on 8876  Progress: 4377 on 8876  Progress: 4378 on 8876  Progress: 4379 on 8876  Progress: 4380 on 8876  Progress: 4381 on 8876  Progress: 4382 on 8876  Progress: 4383 on 8876  Progress: 4384 on 8876  Progress: 4385 on 8876  Progress: 4386 on 8876  Progress: 4387 on 8876  Progress: 4388 on 8876  Progress: 4389 on 8876  Progress: 4390 on 8876  Progress: 4391 on 8876  Progress: 4392 on 8876  Progress: 4393 on 8876  Progress: 4394 on 8876  Progress: 4395 on 8876  Progress: 4396 on 8876  Progress: 4397 on 8876  Progress: 4398 on 8876  Progress: 4399 on 8876  Progress: 4400 on 8876  Progress: 4401 on 8876  Progress: 4402 on 8876  Progress: 4403 on 8876  Progress: 4404 on 8876  Progress: 4405 on 8876  Progress: 4406 on 8876  Progress: 4407 on 8876  Progress: 4408 on 8876  Progress: 4409 on 8876  Progress: 4410 on 8876  Progress: 4411 on 8876  Progress: 4412 on 8876  Progress: 4413 on 8876  Progress: 4414 on 8876  Progress: 4415 on 8876  Progress: 4416 on 8876  Progress: 4417 on 8876  Progress: 4418 on 8876  Progress: 4419 on 8876  Progress: 4420 on 8876  Progress: 4421 on 8876  Progress: 4422 on 8876  Progress: 4423 on 8876  Progress: 4424 on 8876  Progress: 4425 on 8876  Progress: 4426 on 8876  Progress: 4427 on 8876  Progress: 4428 on 8876  Progress: 4429 on 8876  Progress: 4430 on 8876  Progress: 4431 on 8876  Progress: 4432 on 8876  Progress: 4433 on 8876  Progress: 4434 on 8876  Progress: 4435 on 8876  Progress: 4436 on 8876  Progress: 4437 on 8876  Progress: 4438 on 8876  Progress: 4439 on 8876  Progress: 4440 on 8876  Progress: 4441 on 8876  Progress: 4442 on 8876  Progress: 4443 on 8876  Progress: 4444 on 8876  Progress: 4445 on 8876  Progress: 4446 on 8876  Progress: 4447 on 8876  Progress: 4448 on 8876  Progress: 4449 on 8876  Progress: 4450 on 8876  Progress: 4451 on 8876  Progress: 4452 on 8876  Progress: 4453 on 8876  Progress: 4454 on 8876  Progress: 4455 on 8876  Progress: 4456 on 8876  Progress: 4457 on 8876  Progress: 4458 on 8876  Progress: 4459 on 8876  Progress: 4460 on 8876  Progress: 4461 on 8876  Progress: 4462 on 8876  Progress: 4463 on 8876  Progress: 4464 on 8876  Progress: 4465 on 8876  Progress: 4466 on 8876  Progress: 4467 on 8876  Progress: 4468 on 8876  Progress: 4469 on 8876  Progress: 4470 on 8876  Progress: 4471 on 8876  Progress: 4472 on 8876  Progress: 4473 on 8876  Progress: 4474 on 8876  Progress: 4475 on 8876  Progress: 4476 on 8876  Progress: 4477 on 8876  Progress: 4478 on 8876  Progress: 4479 on 8876  Progress: 4480 on 8876  Progress: 4481 on 8876  Progress: 4482 on 8876  Progress: 4483 on 8876  Progress: 4484 on 8876  Progress: 4485 on 8876  Progress: 4486 on 8876  Progress: 4487 on 8876  Progress: 4488 on 8876  Progress: 4489 on 8876  Progress: 4490 on 8876  Progress: 4491 on 8876  Progress: 4492 on 8876  Progress: 4493 on 8876  Progress: 4494 on 8876  Progress: 4495 on 8876  Progress: 4496 on 8876  Progress: 4497 on 8876  Progress: 4498 on 8876  Progress: 4499 on 8876  Progress: 4500 on 8876  Progress: 4501 on 8876  Progress: 4502 on 8876  Progress: 4503 on 8876  Progress: 4504 on 8876  Progress: 4505 on 8876  Progress: 4506 on 8876  Progress: 4507 on 8876  Progress: 4508 on 8876  Progress: 4509 on 8876  Progress: 4510 on 8876  Progress: 4511 on 8876  Progress: 4512 on 8876  Progress: 4513 on 8876  Progress: 4514 on 8876  Progress: 4515 on 8876  Progress: 4516 on 8876  Progress: 4517 on 8876  Progress: 4518 on 8876  Progress: 4519 on 8876  Progress: 4520 on 8876  Progress: 4521 on 8876  Progress: 4522 on 8876  Progress: 4523 on 8876  Progress: 4524 on 8876  Progress: 4525 on 8876  Progress: 4526 on 8876  Progress: 4527 on 8876  Progress: 4528 on 8876  Progress: 4529 on 8876  Progress: 4530 on 8876  Progress: 4531 on 8876  Progress: 4532 on 8876  Progress: 4533 on 8876  Progress: 4534 on 8876  Progress: 4535 on 8876  Progress: 4536 on 8876  Progress: 4537 on 8876  Progress: 4538 on 8876  Progress: 4539 on 8876  Progress: 4540 on 8876  Progress: 4541 on 8876  Progress: 4542 on 8876  Progress: 4543 on 8876  Progress: 4544 on 8876  Progress: 4545 on 8876  Progress: 4546 on 8876  Progress: 4547 on 8876  Progress: 4548 on 8876  Progress: 4549 on 8876  Progress: 4550 on 8876  Progress: 4551 on 8876  Progress: 4552 on 8876  Progress: 4553 on 8876  Progress: 4554 on 8876  Progress: 4555 on 8876  Progress: 4556 on 8876  Progress: 4557 on 8876  Progress: 4558 on 8876  Progress: 4559 on 8876  Progress: 4560 on 8876  Progress: 4561 on 8876  Progress: 4562 on 8876  Progress: 4563 on 8876  Progress: 4564 on 8876  Progress: 4565 on 8876  Progress: 4566 on 8876  Progress: 4567 on 8876  Progress: 4568 on 8876  Progress: 4569 on 8876  Progress: 4570 on 8876  Progress: 4571 on 8876  Progress: 4572 on 8876  Progress: 4573 on 8876  Progress: 4574 on 8876  Progress: 4575 on 8876  Progress: 4576 on 8876  Progress: 4577 on 8876  Progress: 4578 on 8876  Progress: 4579 on 8876  Progress: 4580 on 8876  Progress: 4581 on 8876  Progress: 4582 on 8876  Progress: 4583 on 8876  Progress: 4584 on 8876  Progress: 4585 on 8876  Progress: 4586 on 8876  Progress: 4587 on 8876  Progress: 4588 on 8876  Progress: 4589 on 8876  Progress: 4590 on 8876  Progress: 4591 on 8876  Progress: 4592 on 8876  Progress: 4593 on 8876  Progress: 4594 on 8876  Progress: 4595 on 8876  Progress: 4596 on 8876  Progress: 4597 on 8876  Progress: 4598 on 8876  Progress: 4599 on 8876  Progress: 4600 on 8876  Progress: 4601 on 8876  Progress: 4602 on 8876  Progress: 4603 on 8876  Progress: 4604 on 8876  Progress: 4605 on 8876  Progress: 4606 on 8876  Progress: 4607 on 8876  Progress: 4608 on 8876  Progress: 4609 on 8876  Progress: 4610 on 8876  Progress: 4611 on 8876  Progress: 4612 on 8876  Progress: 4613 on 8876  Progress: 4614 on 8876  Progress: 4615 on 8876  Progress: 4616 on 8876  Progress: 4617 on 8876  Progress: 4618 on 8876  Progress: 4619 on 8876  Progress: 4620 on 8876  Progress: 4621 on 8876  Progress: 4622 on 8876  Progress: 4623 on 8876  Progress: 4624 on 8876  Progress: 4625 on 8876  Progress: 4626 on 8876  Progress: 4627 on 8876  Progress: 4628 on 8876  Progress: 4629 on 8876  Progress: 4630 on 8876  Progress: 4631 on 8876  Progress: 4632 on 8876  Progress: 4633 on 8876  Progress: 4634 on 8876  Progress: 4635 on 8876  Progress: 4636 on 8876  Progress: 4637 on 8876  Progress: 4638 on 8876  Progress: 4639 on 8876  Progress: 4640 on 8876  Progress: 4641 on 8876  Progress: 4642 on 8876  Progress: 4643 on 8876  Progress: 4644 on 8876  Progress: 4645 on 8876  Progress: 4646 on 8876  Progress: 4647 on 8876  Progress: 4648 on 8876  Progress: 4649 on 8876  Progress: 4650 on 8876  Progress: 4651 on 8876  Progress: 4652 on 8876  Progress: 4653 on 8876  Progress: 4654 on 8876  Progress: 4655 on 8876  Progress: 4656 on 8876  Progress: 4657 on 8876  Progress: 4658 on 8876  Progress: 4659 on 8876  Progress: 4660 on 8876  Progress: 4661 on 8876  Progress: 4662 on 8876  Progress: 4663 on 8876  Progress: 4664 on 8876  Progress: 4665 on 8876  Progress: 4666 on 8876  Progress: 4667 on 8876  Progress: 4668 on 8876  Progress: 4669 on 8876  Progress: 4670 on 8876  Progress: 4671 on 8876  Progress: 4672 on 8876  Progress: 4673 on 8876  Progress: 4674 on 8876  Progress: 4675 on 8876  Progress: 4676 on 8876  Progress: 4677 on 8876  Progress: 4678 on 8876  Progress: 4679 on 8876  Progress: 4680 on 8876  Progress: 4681 on 8876  Progress: 4682 on 8876  Progress: 4683 on 8876  Progress: 4684 on 8876  Progress: 4685 on 8876  Progress: 4686 on 8876  Progress: 4687 on 8876  Progress: 4688 on 8876  Progress: 4689 on 8876  Progress: 4690 on 8876  Progress: 4691 on 8876  Progress: 4692 on 8876  Progress: 4693 on 8876  Progress: 4694 on 8876  Progress: 4695 on 8876  Progress: 4696 on 8876  Progress: 4697 on 8876  Progress: 4698 on 8876  Progress: 4699 on 8876  Progress: 4700 on 8876  Progress: 4701 on 8876  Progress: 4702 on 8876  Progress: 4703 on 8876  Progress: 4704 on 8876  Progress: 4705 on 8876  Progress: 4706 on 8876  Progress: 4707 on 8876  Progress: 4708 on 8876  Progress: 4709 on 8876  Progress: 4710 on 8876  Progress: 4711 on 8876  Progress: 4712 on 8876  Progress: 4713 on 8876  Progress: 4714 on 8876  Progress: 4715 on 8876  Progress: 4716 on 8876  Progress: 4717 on 8876  Progress: 4718 on 8876  Progress: 4719 on 8876  Progress: 4720 on 8876  Progress: 4721 on 8876  Progress: 4722 on 8876  Progress: 4723 on 8876  Progress: 4724 on 8876  Progress: 4725 on 8876  Progress: 4726 on 8876  Progress: 4727 on 8876  Progress: 4728 on 8876  Progress: 4729 on 8876  Progress: 4730 on 8876  Progress: 4731 on 8876  Progress: 4732 on 8876  Progress: 4733 on 8876  Progress: 4734 on 8876  Progress: 4735 on 8876  Progress: 4736 on 8876  Progress: 4737 on 8876  Progress: 4738 on 8876  Progress: 4739 on 8876  Progress: 4740 on 8876  Progress: 4741 on 8876  Progress: 4742 on 8876  Progress: 4743 on 8876  Progress: 4744 on 8876  Progress: 4745 on 8876  Progress: 4746 on 8876  Progress: 4747 on 8876  Progress: 4748 on 8876  Progress: 4749 on 8876  Progress: 4750 on 8876  Progress: 4751 on 8876  Progress: 4752 on 8876  Progress: 4753 on 8876  Progress: 4754 on 8876  Progress: 4755 on 8876  Progress: 4756 on 8876  Progress: 4757 on 8876  Progress: 4758 on 8876  Progress: 4759 on 8876  Progress: 4760 on 8876  Progress: 4761 on 8876  Progress: 4762 on 8876  Progress: 4763 on 8876  Progress: 4764 on 8876  Progress: 4765 on 8876  Progress: 4766 on 8876  Progress: 4767 on 8876  Progress: 4768 on 8876  Progress: 4769 on 8876  Progress: 4770 on 8876  Progress: 4771 on 8876  Progress: 4772 on 8876  Progress: 4773 on 8876  Progress: 4774 on 8876  Progress: 4775 on 8876  Progress: 4776 on 8876  Progress: 4777 on 8876  Progress: 4778 on 8876  Progress: 4779 on 8876  Progress: 4780 on 8876  Progress: 4781 on 8876  Progress: 4782 on 8876  Progress: 4783 on 8876  Progress: 4784 on 8876  Progress: 4785 on 8876  Progress: 4786 on 8876  Progress: 4787 on 8876  Progress: 4788 on 8876  Progress: 4789 on 8876  Progress: 4790 on 8876  Progress: 4791 on 8876  Progress: 4792 on 8876  Progress: 4793 on 8876  Progress: 4794 on 8876  Progress: 4795 on 8876  Progress: 4796 on 8876  Progress: 4797 on 8876  Progress: 4798 on 8876  Progress: 4799 on 8876  Progress: 4800 on 8876  Progress: 4801 on 8876  Progress: 4802 on 8876  Progress: 4803 on 8876  Progress: 4804 on 8876  Progress: 4805 on 8876  Progress: 4806 on 8876  Progress: 4807 on 8876  Progress: 4808 on 8876  Progress: 4809 on 8876  Progress: 4810 on 8876  Progress: 4811 on 8876  Progress: 4812 on 8876  Progress: 4813 on 8876  Progress: 4814 on 8876  Progress: 4815 on 8876  Progress: 4816 on 8876  Progress: 4817 on 8876  Progress: 4818 on 8876  Progress: 4819 on 8876  Progress: 4820 on 8876  Progress: 4821 on 8876  Progress: 4822 on 8876  Progress: 4823 on 8876  Progress: 4824 on 8876  Progress: 4825 on 8876  Progress: 4826 on 8876  Progress: 4827 on 8876  Progress: 4828 on 8876  Progress: 4829 on 8876  Progress: 4830 on 8876  Progress: 4831 on 8876  Progress: 4832 on 8876  Progress: 4833 on 8876  Progress: 4834 on 8876  Progress: 4835 on 8876  Progress: 4836 on 8876  Progress: 4837 on 8876  Progress: 4838 on 8876  Progress: 4839 on 8876  Progress: 4840 on 8876  Progress: 4841 on 8876  Progress: 4842 on 8876  Progress: 4843 on 8876  Progress: 4844 on 8876  Progress: 4845 on 8876  Progress: 4846 on 8876  Progress: 4847 on 8876  Progress: 4848 on 8876  Progress: 4849 on 8876  Progress: 4850 on 8876  Progress: 4851 on 8876  Progress: 4852 on 8876  Progress: 4853 on 8876  Progress: 4854 on 8876  Progress: 4855 on 8876  Progress: 4856 on 8876  Progress: 4857 on 8876  Progress: 4858 on 8876  Progress: 4859 on 8876  Progress: 4860 on 8876  Progress: 4861 on 8876  Progress: 4862 on 8876  Progress: 4863 on 8876  Progress: 4864 on 8876  Progress: 4865 on 8876  Progress: 4866 on 8876  Progress: 4867 on 8876  Progress: 4868 on 8876  Progress: 4869 on 8876  Progress: 4870 on 8876  Progress: 4871 on 8876  Progress: 4872 on 8876  Progress: 4873 on 8876  Progress: 4874 on 8876  Progress: 4875 on 8876  Progress: 4876 on 8876  Progress: 4877 on 8876  Progress: 4878 on 8876  Progress: 4879 on 8876  Progress: 4880 on 8876  Progress: 4881 on 8876  Progress: 4882 on 8876  Progress: 4883 on 8876  Progress: 4884 on 8876  Progress: 4885 on 8876  Progress: 4886 on 8876  Progress: 4887 on 8876  Progress: 4888 on 8876  Progress: 4889 on 8876  Progress: 4890 on 8876  Progress: 4891 on 8876  Progress: 4892 on 8876  Progress: 4893 on 8876  Progress: 4894 on 8876  Progress: 4895 on 8876  Progress: 4896 on 8876  Progress: 4897 on 8876  Progress: 4898 on 8876  Progress: 4899 on 8876  Progress: 4900 on 8876  Progress: 4901 on 8876  Progress: 4902 on 8876  Progress: 4903 on 8876  Progress: 4904 on 8876  Progress: 4905 on 8876  Progress: 4906 on 8876  Progress: 4907 on 8876  Progress: 4908 on 8876  Progress: 4909 on 8876  Progress: 4910 on 8876  Progress: 4911 on 8876  Progress: 4912 on 8876  Progress: 4913 on 8876  Progress: 4914 on 8876  Progress: 4915 on 8876  Progress: 4916 on 8876  Progress: 4917 on 8876  Progress: 4918 on 8876  Progress: 4919 on 8876  Progress: 4920 on 8876  Progress: 4921 on 8876  Progress: 4922 on 8876  Progress: 4923 on 8876  Progress: 4924 on 8876  Progress: 4925 on 8876  Progress: 4926 on 8876  Progress: 4927 on 8876  Progress: 4928 on 8876  Progress: 4929 on 8876  Progress: 4930 on 8876  Progress: 4931 on 8876  Progress: 4932 on 8876  Progress: 4933 on 8876  Progress: 4934 on 8876  Progress: 4935 on 8876  Progress: 4936 on 8876  Progress: 4937 on 8876  Progress: 4938 on 8876  Progress: 4939 on 8876  Progress: 4940 on 8876  Progress: 4941 on 8876  Progress: 4942 on 8876  Progress: 4943 on 8876  Progress: 4944 on 8876  Progress: 4945 on 8876  Progress: 4946 on 8876  Progress: 4947 on 8876  Progress: 4948 on 8876  Progress: 4949 on 8876  Progress: 4950 on 8876  Progress: 4951 on 8876  Progress: 4952 on 8876  Progress: 4953 on 8876  Progress: 4954 on 8876  Progress: 4955 on 8876  Progress: 4956 on 8876  Progress: 4957 on 8876  Progress: 4958 on 8876  Progress: 4959 on 8876  Progress: 4960 on 8876  Progress: 4961 on 8876  Progress: 4962 on 8876  Progress: 4963 on 8876  Progress: 4964 on 8876  Progress: 4965 on 8876  Progress: 4966 on 8876  Progress: 4967 on 8876  Progress: 4968 on 8876  Progress: 4969 on 8876  Progress: 4970 on 8876  Progress: 4971 on 8876  Progress: 4972 on 8876  Progress: 4973 on 8876  Progress: 4974 on 8876  Progress: 4975 on 8876  Progress: 4976 on 8876  Progress: 4977 on 8876  Progress: 4978 on 8876  Progress: 4979 on 8876  Progress: 4980 on 8876  Progress: 4981 on 8876  Progress: 4982 on 8876  Progress: 4983 on 8876  Progress: 4984 on 8876  Progress: 4985 on 8876  Progress: 4986 on 8876  Progress: 4987 on 8876  Progress: 4988 on 8876  Progress: 4989 on 8876  Progress: 4990 on 8876  Progress: 4991 on 8876  Progress: 4992 on 8876  Progress: 4993 on 8876  Progress: 4994 on 8876  Progress: 4995 on 8876  Progress: 4996 on 8876  Progress: 4997 on 8876  Progress: 4998 on 8876  Progress: 4999 on 8876  Progress: 5000 on 8876  Progress: 5001 on 8876  Progress: 5002 on 8876  Progress: 5003 on 8876  Progress: 5004 on 8876  Progress: 5005 on 8876  Progress: 5006 on 8876  Progress: 5007 on 8876  Progress: 5008 on 8876  Progress: 5009 on 8876  Progress: 5010 on 8876  Progress: 5011 on 8876  Progress: 5012 on 8876  Progress: 5013 on 8876  Progress: 5014 on 8876  Progress: 5015 on 8876  Progress: 5016 on 8876  Progress: 5017 on 8876  Progress: 5018 on 8876  Progress: 5019 on 8876  Progress: 5020 on 8876  Progress: 5021 on 8876  Progress: 5022 on 8876  Progress: 5023 on 8876  Progress: 5024 on 8876  Progress: 5025 on 8876  Progress: 5026 on 8876  Progress: 5027 on 8876  Progress: 5028 on 8876  Progress: 5029 on 8876  Progress: 5030 on 8876  Progress: 5031 on 8876  Progress: 5032 on 8876  Progress: 5033 on 8876  Progress: 5034 on 8876  Progress: 5035 on 8876  Progress: 5036 on 8876  Progress: 5037 on 8876  Progress: 5038 on 8876  Progress: 5039 on 8876  Progress: 5040 on 8876  Progress: 5041 on 8876  Progress: 5042 on 8876  Progress: 5043 on 8876  Progress: 5044 on 8876  Progress: 5045 on 8876  Progress: 5046 on 8876  Progress: 5047 on 8876  Progress: 5048 on 8876  Progress: 5049 on 8876  Progress: 5050 on 8876  Progress: 5051 on 8876  Progress: 5052 on 8876  Progress: 5053 on 8876  Progress: 5054 on 8876  Progress: 5055 on 8876  Progress: 5056 on 8876  Progress: 5057 on 8876  Progress: 5058 on 8876  Progress: 5059 on 8876  Progress: 5060 on 8876  Progress: 5061 on 8876  Progress: 5062 on 8876  Progress: 5063 on 8876  Progress: 5064 on 8876  Progress: 5065 on 8876  Progress: 5066 on 8876  Progress: 5067 on 8876  Progress: 5068 on 8876  Progress: 5069 on 8876  Progress: 5070 on 8876  Progress: 5071 on 8876  Progress: 5072 on 8876  Progress: 5073 on 8876  Progress: 5074 on 8876  Progress: 5075 on 8876  Progress: 5076 on 8876  Progress: 5077 on 8876  Progress: 5078 on 8876  Progress: 5079 on 8876  Progress: 5080 on 8876  Progress: 5081 on 8876  Progress: 5082 on 8876  Progress: 5083 on 8876  Progress: 5084 on 8876  Progress: 5085 on 8876  Progress: 5086 on 8876  Progress: 5087 on 8876  Progress: 5088 on 8876  Progress: 5089 on 8876  Progress: 5090 on 8876  Progress: 5091 on 8876  Progress: 5092 on 8876  Progress: 5093 on 8876  Progress: 5094 on 8876  Progress: 5095 on 8876  Progress: 5096 on 8876  Progress: 5097 on 8876  Progress: 5098 on 8876  Progress: 5099 on 8876  Progress: 5100 on 8876  Progress: 5101 on 8876  Progress: 5102 on 8876  Progress: 5103 on 8876  Progress: 5104 on 8876  Progress: 5105 on 8876  Progress: 5106 on 8876  Progress: 5107 on 8876  Progress: 5108 on 8876  Progress: 5109 on 8876  Progress: 5110 on 8876  Progress: 5111 on 8876  Progress: 5112 on 8876  Progress: 5113 on 8876  Progress: 5114 on 8876  Progress: 5115 on 8876  Progress: 5116 on 8876  Progress: 5117 on 8876  Progress: 5118 on 8876  Progress: 5119 on 8876  Progress: 5120 on 8876  Progress: 5121 on 8876  Progress: 5122 on 8876  Progress: 5123 on 8876  Progress: 5124 on 8876  Progress: 5125 on 8876  Progress: 5126 on 8876  Progress: 5127 on 8876  Progress: 5128 on 8876  Progress: 5129 on 8876  Progress: 5130 on 8876  Progress: 5131 on 8876  Progress: 5132 on 8876  Progress: 5133 on 8876  Progress: 5134 on 8876  Progress: 5135 on 8876  Progress: 5136 on 8876  Progress: 5137 on 8876  Progress: 5138 on 8876  Progress: 5139 on 8876  Progress: 5140 on 8876  Progress: 5141 on 8876  Progress: 5142 on 8876  Progress: 5143 on 8876  Progress: 5144 on 8876  Progress: 5145 on 8876  Progress: 5146 on 8876  Progress: 5147 on 8876  Progress: 5148 on 8876  Progress: 5149 on 8876  Progress: 5150 on 8876  Progress: 5151 on 8876  Progress: 5152 on 8876  Progress: 5153 on 8876  Progress: 5154 on 8876  Progress: 5155 on 8876  Progress: 5156 on 8876  Progress: 5157 on 8876  Progress: 5158 on 8876  Progress: 5159 on 8876  Progress: 5160 on 8876  Progress: 5161 on 8876  Progress: 5162 on 8876  Progress: 5163 on 8876  Progress: 5164 on 8876  Progress: 5165 on 8876  Progress: 5166 on 8876  Progress: 5167 on 8876  Progress: 5168 on 8876  Progress: 5169 on 8876  Progress: 5170 on 8876  Progress: 5171 on 8876  Progress: 5172 on 8876  Progress: 5173 on 8876  Progress: 5174 on 8876  Progress: 5175 on 8876  Progress: 5176 on 8876  Progress: 5177 on 8876  Progress: 5178 on 8876  Progress: 5179 on 8876  Progress: 5180 on 8876  Progress: 5181 on 8876  Progress: 5182 on 8876  Progress: 5183 on 8876  Progress: 5184 on 8876  Progress: 5185 on 8876  Progress: 5186 on 8876  Progress: 5187 on 8876  Progress: 5188 on 8876  Progress: 5189 on 8876  Progress: 5190 on 8876  Progress: 5191 on 8876  Progress: 5192 on 8876  Progress: 5193 on 8876  Progress: 5194 on 8876  Progress: 5195 on 8876  Progress: 5196 on 8876  Progress: 5197 on 8876  Progress: 5198 on 8876  Progress: 5199 on 8876  Progress: 5200 on 8876  Progress: 5201 on 8876  Progress: 5202 on 8876  Progress: 5203 on 8876  Progress: 5204 on 8876  Progress: 5205 on 8876  Progress: 5206 on 8876  Progress: 5207 on 8876  Progress: 5208 on 8876  Progress: 5209 on 8876  Progress: 5210 on 8876  Progress: 5211 on 8876  Progress: 5212 on 8876  Progress: 5213 on 8876  Progress: 5214 on 8876  Progress: 5215 on 8876  Progress: 5216 on 8876  Progress: 5217 on 8876  Progress: 5218 on 8876  Progress: 5219 on 8876  Progress: 5220 on 8876  Progress: 5221 on 8876  Progress: 5222 on 8876  Progress: 5223 on 8876  Progress: 5224 on 8876  Progress: 5225 on 8876  Progress: 5226 on 8876  Progress: 5227 on 8876  Progress: 5228 on 8876  Progress: 5229 on 8876  Progress: 5230 on 8876  Progress: 5231 on 8876  Progress: 5232 on 8876  Progress: 5233 on 8876  Progress: 5234 on 8876  Progress: 5235 on 8876  Progress: 5236 on 8876  Progress: 5237 on 8876  Progress: 5238 on 8876  Progress: 5239 on 8876  Progress: 5240 on 8876  Progress: 5241 on 8876  Progress: 5242 on 8876  Progress: 5243 on 8876  Progress: 5244 on 8876  Progress: 5245 on 8876  Progress: 5246 on 8876  Progress: 5247 on 8876  Progress: 5248 on 8876  Progress: 5249 on 8876  Progress: 5250 on 8876  Progress: 5251 on 8876  Progress: 5252 on 8876  Progress: 5253 on 8876  Progress: 5254 on 8876  Progress: 5255 on 8876  Progress: 5256 on 8876  Progress: 5257 on 8876  Progress: 5258 on 8876  Progress: 5259 on 8876  Progress: 5260 on 8876  Progress: 5261 on 8876  Progress: 5262 on 8876  Progress: 5263 on 8876  Progress: 5264 on 8876  Progress: 5265 on 8876  Progress: 5266 on 8876  Progress: 5267 on 8876  Progress: 5268 on 8876  Progress: 5269 on 8876  Progress: 5270 on 8876  Progress: 5271 on 8876  Progress: 5272 on 8876  Progress: 5273 on 8876  Progress: 5274 on 8876  Progress: 5275 on 8876  Progress: 5276 on 8876  Progress: 5277 on 8876  Progress: 5278 on 8876  Progress: 5279 on 8876  Progress: 5280 on 8876  Progress: 5281 on 8876  Progress: 5282 on 8876  Progress: 5283 on 8876  Progress: 5284 on 8876  Progress: 5285 on 8876  Progress: 5286 on 8876  Progress: 5287 on 8876  Progress: 5288 on 8876  Progress: 5289 on 8876  Progress: 5290 on 8876  Progress: 5291 on 8876  Progress: 5292 on 8876  Progress: 5293 on 8876  Progress: 5294 on 8876  Progress: 5295 on 8876  Progress: 5296 on 8876  Progress: 5297 on 8876  Progress: 5298 on 8876  Progress: 5299 on 8876  Progress: 5300 on 8876  Progress: 5301 on 8876  Progress: 5302 on 8876  Progress: 5303 on 8876  Progress: 5304 on 8876  Progress: 5305 on 8876  Progress: 5306 on 8876  Progress: 5307 on 8876  Progress: 5308 on 8876  Progress: 5309 on 8876  Progress: 5310 on 8876  Progress: 5311 on 8876  Progress: 5312 on 8876  Progress: 5313 on 8876  Progress: 5314 on 8876  Progress: 5315 on 8876  Progress: 5316 on 8876  Progress: 5317 on 8876  Progress: 5318 on 8876  Progress: 5319 on 8876  Progress: 5320 on 8876  Progress: 5321 on 8876  Progress: 5322 on 8876  Progress: 5323 on 8876  Progress: 5324 on 8876  Progress: 5325 on 8876  Progress: 5326 on 8876  Progress: 5327 on 8876  Progress: 5328 on 8876  Progress: 5329 on 8876  Progress: 5330 on 8876  Progress: 5331 on 8876  Progress: 5332 on 8876  Progress: 5333 on 8876  Progress: 5334 on 8876  Progress: 5335 on 8876  Progress: 5336 on 8876  Progress: 5337 on 8876  Progress: 5338 on 8876  Progress: 5339 on 8876  Progress: 5340 on 8876  Progress: 5341 on 8876  Progress: 5342 on 8876  Progress: 5343 on 8876  Progress: 5344 on 8876  Progress: 5345 on 8876  Progress: 5346 on 8876  Progress: 5347 on 8876  Progress: 5348 on 8876  Progress: 5349 on 8876  Progress: 5350 on 8876  Progress: 5351 on 8876  Progress: 5352 on 8876  Progress: 5353 on 8876  Progress: 5354 on 8876  Progress: 5355 on 8876  Progress: 5356 on 8876  Progress: 5357 on 8876  Progress: 5358 on 8876  Progress: 5359 on 8876  Progress: 5360 on 8876  Progress: 5361 on 8876  Progress: 5362 on 8876  Progress: 5363 on 8876  Progress: 5364 on 8876  Progress: 5365 on 8876  Progress: 5366 on 8876  Progress: 5367 on 8876  Progress: 5368 on 8876  Progress: 5369 on 8876  Progress: 5370 on 8876  Progress: 5371 on 8876  Progress: 5372 on 8876  Progress: 5373 on 8876  Progress: 5374 on 8876  Progress: 5375 on 8876  Progress: 5376 on 8876  Progress: 5377 on 8876  Progress: 5378 on 8876  Progress: 5379 on 8876  Progress: 5380 on 8876  Progress: 5381 on 8876  Progress: 5382 on 8876  Progress: 5383 on 8876  Progress: 5384 on 8876  Progress: 5385 on 8876  Progress: 5386 on 8876  Progress: 5387 on 8876  Progress: 5388 on 8876  Progress: 5389 on 8876  Progress: 5390 on 8876  Progress: 5391 on 8876  Progress: 5392 on 8876  Progress: 5393 on 8876  Progress: 5394 on 8876  Progress: 5395 on 8876  Progress: 5396 on 8876  Progress: 5397 on 8876  Progress: 5398 on 8876  Progress: 5399 on 8876  Progress: 5400 on 8876  Progress: 5401 on 8876  Progress: 5402 on 8876  Progress: 5403 on 8876  Progress: 5404 on 8876  Progress: 5405 on 8876  Progress: 5406 on 8876  Progress: 5407 on 8876  Progress: 5408 on 8876  Progress: 5409 on 8876  Progress: 5410 on 8876  Progress: 5411 on 8876  Progress: 5412 on 8876  Progress: 5413 on 8876  Progress: 5414 on 8876  Progress: 5415 on 8876  Progress: 5416 on 8876  Progress: 5417 on 8876  Progress: 5418 on 8876  Progress: 5419 on 8876  Progress: 5420 on 8876  Progress: 5421 on 8876  Progress: 5422 on 8876  Progress: 5423 on 8876  Progress: 5424 on 8876  Progress: 5425 on 8876  Progress: 5426 on 8876  Progress: 5427 on 8876  Progress: 5428 on 8876  Progress: 5429 on 8876  Progress: 5430 on 8876  Progress: 5431 on 8876  Progress: 5432 on 8876  Progress: 5433 on 8876  Progress: 5434 on 8876  Progress: 5435 on 8876  Progress: 5436 on 8876  Progress: 5437 on 8876  Progress: 5438 on 8876  Progress: 5439 on 8876  Progress: 5440 on 8876  Progress: 5441 on 8876  Progress: 5442 on 8876  Progress: 5443 on 8876  Progress: 5444 on 8876  Progress: 5445 on 8876  Progress: 5446 on 8876  Progress: 5447 on 8876  Progress: 5448 on 8876  Progress: 5449 on 8876  Progress: 5450 on 8876  Progress: 5451 on 8876  Progress: 5452 on 8876  Progress: 5453 on 8876  Progress: 5454 on 8876  Progress: 5455 on 8876  Progress: 5456 on 8876  Progress: 5457 on 8876  Progress: 5458 on 8876  Progress: 5459 on 8876  Progress: 5460 on 8876  Progress: 5461 on 8876  Progress: 5462 on 8876  Progress: 5463 on 8876  Progress: 5464 on 8876  Progress: 5465 on 8876  Progress: 5466 on 8876  Progress: 5467 on 8876  Progress: 5468 on 8876  Progress: 5469 on 8876  Progress: 5470 on 8876  Progress: 5471 on 8876  Progress: 5472 on 8876  Progress: 5473 on 8876  Progress: 5474 on 8876  Progress: 5475 on 8876  Progress: 5476 on 8876  Progress: 5477 on 8876  Progress: 5478 on 8876  Progress: 5479 on 8876  Progress: 5480 on 8876  Progress: 5481 on 8876  Progress: 5482 on 8876  Progress: 5483 on 8876  Progress: 5484 on 8876  Progress: 5485 on 8876  Progress: 5486 on 8876  Progress: 5487 on 8876  Progress: 5488 on 8876  Progress: 5489 on 8876  Progress: 5490 on 8876  Progress: 5491 on 8876  Progress: 5492 on 8876  Progress: 5493 on 8876  Progress: 5494 on 8876  Progress: 5495 on 8876  Progress: 5496 on 8876  Progress: 5497 on 8876  Progress: 5498 on 8876  Progress: 5499 on 8876  Progress: 5500 on 8876  Progress: 5501 on 8876  Progress: 5502 on 8876  Progress: 5503 on 8876  Progress: 5504 on 8876  Progress: 5505 on 8876  Progress: 5506 on 8876  Progress: 5507 on 8876  Progress: 5508 on 8876  Progress: 5509 on 8876  Progress: 5510 on 8876  Progress: 5511 on 8876  Progress: 5512 on 8876  Progress: 5513 on 8876  Progress: 5514 on 8876  Progress: 5515 on 8876  Progress: 5516 on 8876  Progress: 5517 on 8876  Progress: 5518 on 8876  Progress: 5519 on 8876  Progress: 5520 on 8876  Progress: 5521 on 8876  Progress: 5522 on 8876  Progress: 5523 on 8876  Progress: 5524 on 8876  Progress: 5525 on 8876  Progress: 5526 on 8876  Progress: 5527 on 8876  Progress: 5528 on 8876  Progress: 5529 on 8876  Progress: 5530 on 8876  Progress: 5531 on 8876  Progress: 5532 on 8876  Progress: 5533 on 8876  Progress: 5534 on 8876  Progress: 5535 on 8876  Progress: 5536 on 8876  Progress: 5537 on 8876  Progress: 5538 on 8876  Progress: 5539 on 8876  Progress: 5540 on 8876  Progress: 5541 on 8876  Progress: 5542 on 8876  Progress: 5543 on 8876  Progress: 5544 on 8876  Progress: 5545 on 8876  Progress: 5546 on 8876  Progress: 5547 on 8876  Progress: 5548 on 8876  Progress: 5549 on 8876  Progress: 5550 on 8876  Progress: 5551 on 8876  Progress: 5552 on 8876  Progress: 5553 on 8876  Progress: 5554 on 8876  Progress: 5555 on 8876  Progress: 5556 on 8876  Progress: 5557 on 8876  Progress: 5558 on 8876  Progress: 5559 on 8876  Progress: 5560 on 8876  Progress: 5561 on 8876  Progress: 5562 on 8876  Progress: 5563 on 8876  Progress: 5564 on 8876  Progress: 5565 on 8876  Progress: 5566 on 8876  Progress: 5567 on 8876  Progress: 5568 on 8876  Progress: 5569 on 8876  Progress: 5570 on 8876  Progress: 5571 on 8876  Progress: 5572 on 8876  Progress: 5573 on 8876  Progress: 5574 on 8876  Progress: 5575 on 8876  Progress: 5576 on 8876  Progress: 5577 on 8876  Progress: 5578 on 8876  Progress: 5579 on 8876  Progress: 5580 on 8876  Progress: 5581 on 8876  Progress: 5582 on 8876  Progress: 5583 on 8876  Progress: 5584 on 8876  Progress: 5585 on 8876  Progress: 5586 on 8876  Progress: 5587 on 8876  Progress: 5588 on 8876  Progress: 5589 on 8876  Progress: 5590 on 8876  Progress: 5591 on 8876  Progress: 5592 on 8876  Progress: 5593 on 8876  Progress: 5594 on 8876  Progress: 5595 on 8876  Progress: 5596 on 8876  Progress: 5597 on 8876  Progress: 5598 on 8876  Progress: 5599 on 8876  Progress: 5600 on 8876  Progress: 5601 on 8876  Progress: 5602 on 8876  Progress: 5603 on 8876  Progress: 5604 on 8876  Progress: 5605 on 8876  Progress: 5606 on 8876  Progress: 5607 on 8876  Progress: 5608 on 8876  Progress: 5609 on 8876  Progress: 5610 on 8876  Progress: 5611 on 8876  Progress: 5612 on 8876  Progress: 5613 on 8876  Progress: 5614 on 8876  Progress: 5615 on 8876  Progress: 5616 on 8876  Progress: 5617 on 8876  Progress: 5618 on 8876  Progress: 5619 on 8876  Progress: 5620 on 8876  Progress: 5621 on 8876  Progress: 5622 on 8876  Progress: 5623 on 8876  Progress: 5624 on 8876  Progress: 5625 on 8876  Progress: 5626 on 8876  Progress: 5627 on 8876  Progress: 5628 on 8876  Progress: 5629 on 8876  Progress: 5630 on 8876  Progress: 5631 on 8876  Progress: 5632 on 8876  Progress: 5633 on 8876  Progress: 5634 on 8876  Progress: 5635 on 8876  Progress: 5636 on 8876  Progress: 5637 on 8876  Progress: 5638 on 8876  Progress: 5639 on 8876  Progress: 5640 on 8876  Progress: 5641 on 8876  Progress: 5642 on 8876  Progress: 5643 on 8876  Progress: 5644 on 8876  Progress: 5645 on 8876  Progress: 5646 on 8876  Progress: 5647 on 8876  Progress: 5648 on 8876  Progress: 5649 on 8876  Progress: 5650 on 8876  Progress: 5651 on 8876  Progress: 5652 on 8876  Progress: 5653 on 8876  Progress: 5654 on 8876  Progress: 5655 on 8876  Progress: 5656 on 8876  Progress: 5657 on 8876  Progress: 5658 on 8876  Progress: 5659 on 8876  Progress: 5660 on 8876  Progress: 5661 on 8876  Progress: 5662 on 8876  Progress: 5663 on 8876  Progress: 5664 on 8876  Progress: 5665 on 8876  Progress: 5666 on 8876  Progress: 5667 on 8876  Progress: 5668 on 8876  Progress: 5669 on 8876  Progress: 5670 on 8876  Progress: 5671 on 8876  Progress: 5672 on 8876  Progress: 5673 on 8876  Progress: 5674 on 8876  Progress: 5675 on 8876  Progress: 5676 on 8876  Progress: 5677 on 8876  Progress: 5678 on 8876  Progress: 5679 on 8876  Progress: 5680 on 8876  Progress: 5681 on 8876  Progress: 5682 on 8876  Progress: 5683 on 8876  Progress: 5684 on 8876  Progress: 5685 on 8876  Progress: 5686 on 8876  Progress: 5687 on 8876  Progress: 5688 on 8876  Progress: 5689 on 8876  Progress: 5690 on 8876  Progress: 5691 on 8876  Progress: 5692 on 8876  Progress: 5693 on 8876  Progress: 5694 on 8876  Progress: 5695 on 8876  Progress: 5696 on 8876  Progress: 5697 on 8876  Progress: 5698 on 8876  Progress: 5699 on 8876  Progress: 5700 on 8876  Progress: 5701 on 8876  Progress: 5702 on 8876  Progress: 5703 on 8876  Progress: 5704 on 8876  Progress: 5705 on 8876  Progress: 5706 on 8876  Progress: 5707 on 8876  Progress: 5708 on 8876  Progress: 5709 on 8876  Progress: 5710 on 8876  Progress: 5711 on 8876  Progress: 5712 on 8876  Progress: 5713 on 8876  Progress: 5714 on 8876  Progress: 5715 on 8876  Progress: 5716 on 8876  Progress: 5717 on 8876  Progress: 5718 on 8876  Progress: 5719 on 8876  Progress: 5720 on 8876  Progress: 5721 on 8876  Progress: 5722 on 8876  Progress: 5723 on 8876  Progress: 5724 on 8876  Progress: 5725 on 8876  Progress: 5726 on 8876  Progress: 5727 on 8876  Progress: 5728 on 8876  Progress: 5729 on 8876  Progress: 5730 on 8876  Progress: 5731 on 8876  Progress: 5732 on 8876  Progress: 5733 on 8876  Progress: 5734 on 8876  Progress: 5735 on 8876  Progress: 5736 on 8876  Progress: 5737 on 8876  Progress: 5738 on 8876  Progress: 5739 on 8876  Progress: 5740 on 8876  Progress: 5741 on 8876  Progress: 5742 on 8876  Progress: 5743 on 8876  Progress: 5744 on 8876  Progress: 5745 on 8876  Progress: 5746 on 8876  Progress: 5747 on 8876  Progress: 5748 on 8876  Progress: 5749 on 8876  Progress: 5750 on 8876  Progress: 5751 on 8876  Progress: 5752 on 8876  Progress: 5753 on 8876  Progress: 5754 on 8876  Progress: 5755 on 8876  Progress: 5756 on 8876  Progress: 5757 on 8876  Progress: 5758 on 8876  Progress: 5759 on 8876  Progress: 5760 on 8876  Progress: 5761 on 8876  Progress: 5762 on 8876  Progress: 5763 on 8876  Progress: 5764 on 8876  Progress: 5765 on 8876  Progress: 5766 on 8876  Progress: 5767 on 8876  Progress: 5768 on 8876  Progress: 5769 on 8876  Progress: 5770 on 8876  Progress: 5771 on 8876  Progress: 5772 on 8876  Progress: 5773 on 8876  Progress: 5774 on 8876  Progress: 5775 on 8876  Progress: 5776 on 8876  Progress: 5777 on 8876  Progress: 5778 on 8876  Progress: 5779 on 8876  Progress: 5780 on 8876  Progress: 5781 on 8876  Progress: 5782 on 8876  Progress: 5783 on 8876  Progress: 5784 on 8876  Progress: 5785 on 8876  Progress: 5786 on 8876  Progress: 5787 on 8876  Progress: 5788 on 8876  Progress: 5789 on 8876  Progress: 5790 on 8876  Progress: 5791 on 8876  Progress: 5792 on 8876  Progress: 5793 on 8876  Progress: 5794 on 8876  Progress: 5795 on 8876  Progress: 5796 on 8876  Progress: 5797 on 8876  Progress: 5798 on 8876  Progress: 5799 on 8876  Progress: 5800 on 8876  Progress: 5801 on 8876  Progress: 5802 on 8876  Progress: 5803 on 8876  Progress: 5804 on 8876  Progress: 5805 on 8876  Progress: 5806 on 8876  Progress: 5807 on 8876  Progress: 5808 on 8876  Progress: 5809 on 8876  Progress: 5810 on 8876  Progress: 5811 on 8876  Progress: 5812 on 8876  Progress: 5813 on 8876  Progress: 5814 on 8876  Progress: 5815 on 8876  Progress: 5816 on 8876  Progress: 5817 on 8876  Progress: 5818 on 8876  Progress: 5819 on 8876  Progress: 5820 on 8876  Progress: 5821 on 8876  Progress: 5822 on 8876  Progress: 5823 on 8876  Progress: 5824 on 8876  Progress: 5825 on 8876  Progress: 5826 on 8876  Progress: 5827 on 8876  Progress: 5828 on 8876  Progress: 5829 on 8876  Progress: 5830 on 8876  Progress: 5831 on 8876  Progress: 5832 on 8876  Progress: 5833 on 8876  Progress: 5834 on 8876  Progress: 5835 on 8876  Progress: 5836 on 8876  Progress: 5837 on 8876  Progress: 5838 on 8876  Progress: 5839 on 8876  Progress: 5840 on 8876  Progress: 5841 on 8876  Progress: 5842 on 8876  Progress: 5843 on 8876  Progress: 5844 on 8876  Progress: 5845 on 8876  Progress: 5846 on 8876  Progress: 5847 on 8876  Progress: 5848 on 8876  Progress: 5849 on 8876  Progress: 5850 on 8876  Progress: 5851 on 8876  Progress: 5852 on 8876  Progress: 5853 on 8876  Progress: 5854 on 8876  Progress: 5855 on 8876  Progress: 5856 on 8876  Progress: 5857 on 8876  Progress: 5858 on 8876  Progress: 5859 on 8876  Progress: 5860 on 8876  Progress: 5861 on 8876  Progress: 5862 on 8876  Progress: 5863 on 8876  Progress: 5864 on 8876  Progress: 5865 on 8876  Progress: 5866 on 8876  Progress: 5867 on 8876  Progress: 5868 on 8876  Progress: 5869 on 8876  Progress: 5870 on 8876  Progress: 5871 on 8876  Progress: 5872 on 8876  Progress: 5873 on 8876  Progress: 5874 on 8876  Progress: 5875 on 8876  Progress: 5876 on 8876  Progress: 5877 on 8876  Progress: 5878 on 8876  Progress: 5879 on 8876  Progress: 5880 on 8876  Progress: 5881 on 8876  Progress: 5882 on 8876  Progress: 5883 on 8876  Progress: 5884 on 8876  Progress: 5885 on 8876  Progress: 5886 on 8876  Progress: 5887 on 8876  Progress: 5888 on 8876  Progress: 5889 on 8876  Progress: 5890 on 8876  Progress: 5891 on 8876  Progress: 5892 on 8876  Progress: 5893 on 8876  Progress: 5894 on 8876  Progress: 5895 on 8876  Progress: 5896 on 8876  Progress: 5897 on 8876  Progress: 5898 on 8876  Progress: 5899 on 8876  Progress: 5900 on 8876  Progress: 5901 on 8876  Progress: 5902 on 8876  Progress: 5903 on 8876  Progress: 5904 on 8876  Progress: 5905 on 8876  Progress: 5906 on 8876  Progress: 5907 on 8876  Progress: 5908 on 8876  Progress: 5909 on 8876  Progress: 5910 on 8876  Progress: 5911 on 8876  Progress: 5912 on 8876  Progress: 5913 on 8876  Progress: 5914 on 8876  Progress: 5915 on 8876  Progress: 5916 on 8876  Progress: 5917 on 8876  Progress: 5918 on 8876  Progress: 5919 on 8876  Progress: 5920 on 8876  Progress: 5921 on 8876  Progress: 5922 on 8876  Progress: 5923 on 8876  Progress: 5924 on 8876  Progress: 5925 on 8876  Progress: 5926 on 8876  Progress: 5927 on 8876  Progress: 5928 on 8876  Progress: 5929 on 8876  Progress: 5930 on 8876  Progress: 5931 on 8876  Progress: 5932 on 8876  Progress: 5933 on 8876  Progress: 5934 on 8876  Progress: 5935 on 8876  Progress: 5936 on 8876  Progress: 5937 on 8876  Progress: 5938 on 8876  Progress: 5939 on 8876  Progress: 5940 on 8876  Progress: 5941 on 8876  Progress: 5942 on 8876  Progress: 5943 on 8876  Progress: 5944 on 8876  Progress: 5945 on 8876  Progress: 5946 on 8876  Progress: 5947 on 8876  Progress: 5948 on 8876  Progress: 5949 on 8876  Progress: 5950 on 8876  Progress: 5951 on 8876  Progress: 5952 on 8876  Progress: 5953 on 8876  Progress: 5954 on 8876  Progress: 5955 on 8876  Progress: 5956 on 8876  Progress: 5957 on 8876  Progress: 5958 on 8876  Progress: 5959 on 8876  Progress: 5960 on 8876  Progress: 5961 on 8876  Progress: 5962 on 8876  Progress: 5963 on 8876  Progress: 5964 on 8876  Progress: 5965 on 8876  Progress: 5966 on 8876  Progress: 5967 on 8876  Progress: 5968 on 8876  Progress: 5969 on 8876  Progress: 5970 on 8876  Progress: 5971 on 8876  Progress: 5972 on 8876  Progress: 5973 on 8876  Progress: 5974 on 8876  Progress: 5975 on 8876  Progress: 5976 on 8876  Progress: 5977 on 8876  Progress: 5978 on 8876  Progress: 5979 on 8876  Progress: 5980 on 8876  Progress: 5981 on 8876  Progress: 5982 on 8876  Progress: 5983 on 8876  Progress: 5984 on 8876  Progress: 5985 on 8876  Progress: 5986 on 8876  Progress: 5987 on 8876  Progress: 5988 on 8876  Progress: 5989 on 8876  Progress: 5990 on 8876  Progress: 5991 on 8876  Progress: 5992 on 8876  Progress: 5993 on 8876  Progress: 5994 on 8876  Progress: 5995 on 8876  Progress: 5996 on 8876  Progress: 5997 on 8876  Progress: 5998 on 8876  Progress: 5999 on 8876  Progress: 6000 on 8876  Progress: 6001 on 8876  Progress: 6002 on 8876  Progress: 6003 on 8876  Progress: 6004 on 8876  Progress: 6005 on 8876  Progress: 6006 on 8876  Progress: 6007 on 8876  Progress: 6008 on 8876  Progress: 6009 on 8876  Progress: 6010 on 8876  Progress: 6011 on 8876  Progress: 6012 on 8876  Progress: 6013 on 8876  Progress: 6014 on 8876  Progress: 6015 on 8876  Progress: 6016 on 8876  Progress: 6017 on 8876  Progress: 6018 on 8876  Progress: 6019 on 8876  Progress: 6020 on 8876  Progress: 6021 on 8876  Progress: 6022 on 8876  Progress: 6023 on 8876  Progress: 6024 on 8876  Progress: 6025 on 8876  Progress: 6026 on 8876  Progress: 6027 on 8876  Progress: 6028 on 8876  Progress: 6029 on 8876  Progress: 6030 on 8876  Progress: 6031 on 8876  Progress: 6032 on 8876  Progress: 6033 on 8876  Progress: 6034 on 8876  Progress: 6035 on 8876  Progress: 6036 on 8876  Progress: 6037 on 8876  Progress: 6038 on 8876  Progress: 6039 on 8876  Progress: 6040 on 8876  Progress: 6041 on 8876  Progress: 6042 on 8876  Progress: 6043 on 8876  Progress: 6044 on 8876  Progress: 6045 on 8876  Progress: 6046 on 8876  Progress: 6047 on 8876  Progress: 6048 on 8876  Progress: 6049 on 8876  Progress: 6050 on 8876  Progress: 6051 on 8876  Progress: 6052 on 8876  Progress: 6053 on 8876  Progress: 6054 on 8876  Progress: 6055 on 8876  Progress: 6056 on 8876  Progress: 6057 on 8876  Progress: 6058 on 8876  Progress: 6059 on 8876  Progress: 6060 on 8876  Progress: 6061 on 8876  Progress: 6062 on 8876  Progress: 6063 on 8876  Progress: 6064 on 8876  Progress: 6065 on 8876  Progress: 6066 on 8876  Progress: 6067 on 8876  Progress: 6068 on 8876  Progress: 6069 on 8876  Progress: 6070 on 8876  Progress: 6071 on 8876  Progress: 6072 on 8876  Progress: 6073 on 8876  Progress: 6074 on 8876  Progress: 6075 on 8876  Progress: 6076 on 8876  Progress: 6077 on 8876  Progress: 6078 on 8876  Progress: 6079 on 8876  Progress: 6080 on 8876  Progress: 6081 on 8876  Progress: 6082 on 8876  Progress: 6083 on 8876  Progress: 6084 on 8876  Progress: 6085 on 8876  Progress: 6086 on 8876  Progress: 6087 on 8876  Progress: 6088 on 8876  Progress: 6089 on 8876  Progress: 6090 on 8876  Progress: 6091 on 8876  Progress: 6092 on 8876  Progress: 6093 on 8876  Progress: 6094 on 8876  Progress: 6095 on 8876  Progress: 6096 on 8876  Progress: 6097 on 8876  Progress: 6098 on 8876  Progress: 6099 on 8876  Progress: 6100 on 8876  Progress: 6101 on 8876  Progress: 6102 on 8876  Progress: 6103 on 8876  Progress: 6104 on 8876  Progress: 6105 on 8876  Progress: 6106 on 8876  Progress: 6107 on 8876  Progress: 6108 on 8876  Progress: 6109 on 8876  Progress: 6110 on 8876  Progress: 6111 on 8876  Progress: 6112 on 8876  Progress: 6113 on 8876  Progress: 6114 on 8876  Progress: 6115 on 8876  Progress: 6116 on 8876  Progress: 6117 on 8876  Progress: 6118 on 8876  Progress: 6119 on 8876  Progress: 6120 on 8876  Progress: 6121 on 8876  Progress: 6122 on 8876  Progress: 6123 on 8876  Progress: 6124 on 8876  Progress: 6125 on 8876  Progress: 6126 on 8876  Progress: 6127 on 8876  Progress: 6128 on 8876  Progress: 6129 on 8876  Progress: 6130 on 8876  Progress: 6131 on 8876  Progress: 6132 on 8876  Progress: 6133 on 8876  Progress: 6134 on 8876  Progress: 6135 on 8876  Progress: 6136 on 8876  Progress: 6137 on 8876  Progress: 6138 on 8876  Progress: 6139 on 8876  Progress: 6140 on 8876  Progress: 6141 on 8876  Progress: 6142 on 8876  Progress: 6143 on 8876  Progress: 6144 on 8876  Progress: 6145 on 8876  Progress: 6146 on 8876  Progress: 6147 on 8876  Progress: 6148 on 8876  Progress: 6149 on 8876  Progress: 6150 on 8876  Progress: 6151 on 8876  Progress: 6152 on 8876  Progress: 6153 on 8876  Progress: 6154 on 8876  Progress: 6155 on 8876  Progress: 6156 on 8876  Progress: 6157 on 8876  Progress: 6158 on 8876  Progress: 6159 on 8876  Progress: 6160 on 8876  Progress: 6161 on 8876  Progress: 6162 on 8876  Progress: 6163 on 8876  Progress: 6164 on 8876  Progress: 6165 on 8876  Progress: 6166 on 8876  Progress: 6167 on 8876  Progress: 6168 on 8876  Progress: 6169 on 8876  Progress: 6170 on 8876  Progress: 6171 on 8876  Progress: 6172 on 8876  Progress: 6173 on 8876  Progress: 6174 on 8876  Progress: 6175 on 8876  Progress: 6176 on 8876  Progress: 6177 on 8876  Progress: 6178 on 8876  Progress: 6179 on 8876  Progress: 6180 on 8876  Progress: 6181 on 8876  Progress: 6182 on 8876  Progress: 6183 on 8876  Progress: 6184 on 8876  Progress: 6185 on 8876  Progress: 6186 on 8876  Progress: 6187 on 8876  Progress: 6188 on 8876  Progress: 6189 on 8876  Progress: 6190 on 8876  Progress: 6191 on 8876  Progress: 6192 on 8876  Progress: 6193 on 8876  Progress: 6194 on 8876  Progress: 6195 on 8876  Progress: 6196 on 8876  Progress: 6197 on 8876  Progress: 6198 on 8876  Progress: 6199 on 8876  Progress: 6200 on 8876  Progress: 6201 on 8876  Progress: 6202 on 8876  Progress: 6203 on 8876  Progress: 6204 on 8876  Progress: 6205 on 8876  Progress: 6206 on 8876  Progress: 6207 on 8876  Progress: 6208 on 8876  Progress: 6209 on 8876  Progress: 6210 on 8876  Progress: 6211 on 8876  Progress: 6212 on 8876  Progress: 6213 on 8876  Progress: 6214 on 8876  Progress: 6215 on 8876  Progress: 6216 on 8876  Progress: 6217 on 8876  Progress: 6218 on 8876  Progress: 6219 on 8876  Progress: 6220 on 8876  Progress: 6221 on 8876  Progress: 6222 on 8876  Progress: 6223 on 8876  Progress: 6224 on 8876  Progress: 6225 on 8876  Progress: 6226 on 8876  Progress: 6227 on 8876  Progress: 6228 on 8876  Progress: 6229 on 8876  Progress: 6230 on 8876  Progress: 6231 on 8876  Progress: 6232 on 8876  Progress: 6233 on 8876  Progress: 6234 on 8876  Progress: 6235 on 8876  Progress: 6236 on 8876  Progress: 6237 on 8876  Progress: 6238 on 8876  Progress: 6239 on 8876  Progress: 6240 on 8876  Progress: 6241 on 8876  Progress: 6242 on 8876  Progress: 6243 on 8876  Progress: 6244 on 8876  Progress: 6245 on 8876  Progress: 6246 on 8876  Progress: 6247 on 8876  Progress: 6248 on 8876  Progress: 6249 on 8876  Progress: 6250 on 8876  Progress: 6251 on 8876  Progress: 6252 on 8876  Progress: 6253 on 8876  Progress: 6254 on 8876  Progress: 6255 on 8876  Progress: 6256 on 8876  Progress: 6257 on 8876  Progress: 6258 on 8876  Progress: 6259 on 8876  Progress: 6260 on 8876  Progress: 6261 on 8876  Progress: 6262 on 8876  Progress: 6263 on 8876  Progress: 6264 on 8876  Progress: 6265 on 8876  Progress: 6266 on 8876  Progress: 6267 on 8876  Progress: 6268 on 8876  Progress: 6269 on 8876  Progress: 6270 on 8876  Progress: 6271 on 8876  Progress: 6272 on 8876  Progress: 6273 on 8876  Progress: 6274 on 8876  Progress: 6275 on 8876  Progress: 6276 on 8876  Progress: 6277 on 8876  Progress: 6278 on 8876  Progress: 6279 on 8876  Progress: 6280 on 8876  Progress: 6281 on 8876  Progress: 6282 on 8876  Progress: 6283 on 8876  Progress: 6284 on 8876  Progress: 6285 on 8876  Progress: 6286 on 8876  Progress: 6287 on 8876  Progress: 6288 on 8876  Progress: 6289 on 8876  Progress: 6290 on 8876  Progress: 6291 on 8876  Progress: 6292 on 8876  Progress: 6293 on 8876  Progress: 6294 on 8876  Progress: 6295 on 8876  Progress: 6296 on 8876  Progress: 6297 on 8876  Progress: 6298 on 8876  Progress: 6299 on 8876  Progress: 6300 on 8876  Progress: 6301 on 8876  Progress: 6302 on 8876  Progress: 6303 on 8876  Progress: 6304 on 8876  Progress: 6305 on 8876  Progress: 6306 on 8876  Progress: 6307 on 8876  Progress: 6308 on 8876  Progress: 6309 on 8876  Progress: 6310 on 8876  Progress: 6311 on 8876  Progress: 6312 on 8876  Progress: 6313 on 8876  Progress: 6314 on 8876  Progress: 6315 on 8876  Progress: 6316 on 8876  Progress: 6317 on 8876  Progress: 6318 on 8876  Progress: 6319 on 8876  Progress: 6320 on 8876  Progress: 6321 on 8876  Progress: 6322 on 8876  Progress: 6323 on 8876  Progress: 6324 on 8876  Progress: 6325 on 8876  Progress: 6326 on 8876  Progress: 6327 on 8876  Progress: 6328 on 8876  Progress: 6329 on 8876  Progress: 6330 on 8876  Progress: 6331 on 8876  Progress: 6332 on 8876  Progress: 6333 on 8876  Progress: 6334 on 8876  Progress: 6335 on 8876  Progress: 6336 on 8876  Progress: 6337 on 8876  Progress: 6338 on 8876  Progress: 6339 on 8876  Progress: 6340 on 8876  Progress: 6341 on 8876  Progress: 6342 on 8876  Progress: 6343 on 8876  Progress: 6344 on 8876  Progress: 6345 on 8876  Progress: 6346 on 8876  Progress: 6347 on 8876  Progress: 6348 on 8876  Progress: 6349 on 8876  Progress: 6350 on 8876  Progress: 6351 on 8876  Progress: 6352 on 8876  Progress: 6353 on 8876  Progress: 6354 on 8876  Progress: 6355 on 8876  Progress: 6356 on 8876  Progress: 6357 on 8876  Progress: 6358 on 8876  Progress: 6359 on 8876  Progress: 6360 on 8876  Progress: 6361 on 8876  Progress: 6362 on 8876  Progress: 6363 on 8876  Progress: 6364 on 8876  Progress: 6365 on 8876  Progress: 6366 on 8876  Progress: 6367 on 8876  Progress: 6368 on 8876  Progress: 6369 on 8876  Progress: 6370 on 8876  Progress: 6371 on 8876  Progress: 6372 on 8876  Progress: 6373 on 8876  Progress: 6374 on 8876  Progress: 6375 on 8876  Progress: 6376 on 8876  Progress: 6377 on 8876  Progress: 6378 on 8876  Progress: 6379 on 8876  Progress: 6380 on 8876  Progress: 6381 on 8876  Progress: 6382 on 8876  Progress: 6383 on 8876  Progress: 6384 on 8876  Progress: 6385 on 8876  Progress: 6386 on 8876  Progress: 6387 on 8876  Progress: 6388 on 8876  Progress: 6389 on 8876  Progress: 6390 on 8876  Progress: 6391 on 8876  Progress: 6392 on 8876  Progress: 6393 on 8876  Progress: 6394 on 8876  Progress: 6395 on 8876  Progress: 6396 on 8876  Progress: 6397 on 8876  Progress: 6398 on 8876  Progress: 6399 on 8876  Progress: 6400 on 8876  Progress: 6401 on 8876  Progress: 6402 on 8876  Progress: 6403 on 8876  Progress: 6404 on 8876  Progress: 6405 on 8876  Progress: 6406 on 8876  Progress: 6407 on 8876  Progress: 6408 on 8876  Progress: 6409 on 8876  Progress: 6410 on 8876  Progress: 6411 on 8876  Progress: 6412 on 8876  Progress: 6413 on 8876  Progress: 6414 on 8876  Progress: 6415 on 8876  Progress: 6416 on 8876  Progress: 6417 on 8876  Progress: 6418 on 8876  Progress: 6419 on 8876  Progress: 6420 on 8876  Progress: 6421 on 8876  Progress: 6422 on 8876  Progress: 6423 on 8876  Progress: 6424 on 8876  Progress: 6425 on 8876  Progress: 6426 on 8876  Progress: 6427 on 8876  Progress: 6428 on 8876  Progress: 6429 on 8876  Progress: 6430 on 8876  Progress: 6431 on 8876  Progress: 6432 on 8876  Progress: 6433 on 8876  Progress: 6434 on 8876  Progress: 6435 on 8876  Progress: 6436 on 8876  Progress: 6437 on 8876  Progress: 6438 on 8876  Progress: 6439 on 8876  Progress: 6440 on 8876  Progress: 6441 on 8876  Progress: 6442 on 8876  Progress: 6443 on 8876  Progress: 6444 on 8876  Progress: 6445 on 8876  Progress: 6446 on 8876  Progress: 6447 on 8876  Progress: 6448 on 8876  Progress: 6449 on 8876  Progress: 6450 on 8876  Progress: 6451 on 8876  Progress: 6452 on 8876  Progress: 6453 on 8876  Progress: 6454 on 8876  Progress: 6455 on 8876  Progress: 6456 on 8876  Progress: 6457 on 8876  Progress: 6458 on 8876  Progress: 6459 on 8876  Progress: 6460 on 8876  Progress: 6461 on 8876  Progress: 6462 on 8876  Progress: 6463 on 8876  Progress: 6464 on 8876  Progress: 6465 on 8876  Progress: 6466 on 8876  Progress: 6467 on 8876  Progress: 6468 on 8876  Progress: 6469 on 8876  Progress: 6470 on 8876  Progress: 6471 on 8876  Progress: 6472 on 8876  Progress: 6473 on 8876  Progress: 6474 on 8876  Progress: 6475 on 8876  Progress: 6476 on 8876  Progress: 6477 on 8876  Progress: 6478 on 8876  Progress: 6479 on 8876  Progress: 6480 on 8876  Progress: 6481 on 8876  Progress: 6482 on 8876  Progress: 6483 on 8876  Progress: 6484 on 8876  Progress: 6485 on 8876  Progress: 6486 on 8876  Progress: 6487 on 8876  Progress: 6488 on 8876  Progress: 6489 on 8876  Progress: 6490 on 8876  Progress: 6491 on 8876  Progress: 6492 on 8876  Progress: 6493 on 8876  Progress: 6494 on 8876  Progress: 6495 on 8876  Progress: 6496 on 8876  Progress: 6497 on 8876  Progress: 6498 on 8876  Progress: 6499 on 8876  Progress: 6500 on 8876  Progress: 6501 on 8876  Progress: 6502 on 8876  Progress: 6503 on 8876  Progress: 6504 on 8876  Progress: 6505 on 8876  Progress: 6506 on 8876  Progress: 6507 on 8876  Progress: 6508 on 8876  Progress: 6509 on 8876  Progress: 6510 on 8876  Progress: 6511 on 8876  Progress: 6512 on 8876  Progress: 6513 on 8876  Progress: 6514 on 8876  Progress: 6515 on 8876  Progress: 6516 on 8876  Progress: 6517 on 8876  Progress: 6518 on 8876  Progress: 6519 on 8876  Progress: 6520 on 8876  Progress: 6521 on 8876  Progress: 6522 on 8876  Progress: 6523 on 8876  Progress: 6524 on 8876  Progress: 6525 on 8876  Progress: 6526 on 8876  Progress: 6527 on 8876  Progress: 6528 on 8876  Progress: 6529 on 8876  Progress: 6530 on 8876  Progress: 6531 on 8876  Progress: 6532 on 8876  Progress: 6533 on 8876  Progress: 6534 on 8876  Progress: 6535 on 8876  Progress: 6536 on 8876  Progress: 6537 on 8876  Progress: 6538 on 8876  Progress: 6539 on 8876  Progress: 6540 on 8876  Progress: 6541 on 8876  Progress: 6542 on 8876  Progress: 6543 on 8876  Progress: 6544 on 8876  Progress: 6545 on 8876  Progress: 6546 on 8876  Progress: 6547 on 8876  Progress: 6548 on 8876  Progress: 6549 on 8876  Progress: 6550 on 8876  Progress: 6551 on 8876  Progress: 6552 on 8876  Progress: 6553 on 8876  Progress: 6554 on 8876  Progress: 6555 on 8876  Progress: 6556 on 8876  Progress: 6557 on 8876  Progress: 6558 on 8876  Progress: 6559 on 8876  Progress: 6560 on 8876  Progress: 6561 on 8876  Progress: 6562 on 8876  Progress: 6563 on 8876  Progress: 6564 on 8876  Progress: 6565 on 8876  Progress: 6566 on 8876  Progress: 6567 on 8876  Progress: 6568 on 8876  Progress: 6569 on 8876  Progress: 6570 on 8876  Progress: 6571 on 8876  Progress: 6572 on 8876  Progress: 6573 on 8876  Progress: 6574 on 8876  Progress: 6575 on 8876  Progress: 6576 on 8876  Progress: 6577 on 8876  Progress: 6578 on 8876  Progress: 6579 on 8876  Progress: 6580 on 8876  Progress: 6581 on 8876  Progress: 6582 on 8876  Progress: 6583 on 8876  Progress: 6584 on 8876  Progress: 6585 on 8876  Progress: 6586 on 8876  Progress: 6587 on 8876  Progress: 6588 on 8876  Progress: 6589 on 8876  Progress: 6590 on 8876  Progress: 6591 on 8876  Progress: 6592 on 8876  Progress: 6593 on 8876  Progress: 6594 on 8876  Progress: 6595 on 8876  Progress: 6596 on 8876  Progress: 6597 on 8876  Progress: 6598 on 8876  Progress: 6599 on 8876  Progress: 6600 on 8876  Progress: 6601 on 8876  Progress: 6602 on 8876  Progress: 6603 on 8876  Progress: 6604 on 8876  Progress: 6605 on 8876  Progress: 6606 on 8876  Progress: 6607 on 8876  Progress: 6608 on 8876  Progress: 6609 on 8876  Progress: 6610 on 8876  Progress: 6611 on 8876  Progress: 6612 on 8876  Progress: 6613 on 8876  Progress: 6614 on 8876  Progress: 6615 on 8876  Progress: 6616 on 8876  Progress: 6617 on 8876  Progress: 6618 on 8876  Progress: 6619 on 8876  Progress: 6620 on 8876  Progress: 6621 on 8876  Progress: 6622 on 8876  Progress: 6623 on 8876  Progress: 6624 on 8876  Progress: 6625 on 8876  Progress: 6626 on 8876  Progress: 6627 on 8876  Progress: 6628 on 8876  Progress: 6629 on 8876  Progress: 6630 on 8876  Progress: 6631 on 8876  Progress: 6632 on 8876  Progress: 6633 on 8876  Progress: 6634 on 8876  Progress: 6635 on 8876  Progress: 6636 on 8876  Progress: 6637 on 8876  Progress: 6638 on 8876  Progress: 6639 on 8876  Progress: 6640 on 8876  Progress: 6641 on 8876  Progress: 6642 on 8876  Progress: 6643 on 8876  Progress: 6644 on 8876  Progress: 6645 on 8876  Progress: 6646 on 8876  Progress: 6647 on 8876  Progress: 6648 on 8876  Progress: 6649 on 8876  Progress: 6650 on 8876  Progress: 6651 on 8876  Progress: 6652 on 8876  Progress: 6653 on 8876  Progress: 6654 on 8876  Progress: 6655 on 8876  Progress: 6656 on 8876  Progress: 6657 on 8876  Progress: 6658 on 8876  Progress: 6659 on 8876  Progress: 6660 on 8876  Progress: 6661 on 8876  Progress: 6662 on 8876  Progress: 6663 on 8876  Progress: 6664 on 8876  Progress: 6665 on 8876  Progress: 6666 on 8876  Progress: 6667 on 8876  Progress: 6668 on 8876  Progress: 6669 on 8876  Progress: 6670 on 8876  Progress: 6671 on 8876  Progress: 6672 on 8876  Progress: 6673 on 8876  Progress: 6674 on 8876  Progress: 6675 on 8876  Progress: 6676 on 8876  Progress: 6677 on 8876  Progress: 6678 on 8876  Progress: 6679 on 8876  Progress: 6680 on 8876  Progress: 6681 on 8876  Progress: 6682 on 8876  Progress: 6683 on 8876  Progress: 6684 on 8876  Progress: 6685 on 8876  Progress: 6686 on 8876  Progress: 6687 on 8876  Progress: 6688 on 8876  Progress: 6689 on 8876  Progress: 6690 on 8876  Progress: 6691 on 8876  Progress: 6692 on 8876  Progress: 6693 on 8876  Progress: 6694 on 8876  Progress: 6695 on 8876  Progress: 6696 on 8876  Progress: 6697 on 8876  Progress: 6698 on 8876  Progress: 6699 on 8876  Progress: 6700 on 8876  Progress: 6701 on 8876  Progress: 6702 on 8876  Progress: 6703 on 8876  Progress: 6704 on 8876  Progress: 6705 on 8876  Progress: 6706 on 8876  Progress: 6707 on 8876  Progress: 6708 on 8876  Progress: 6709 on 8876  Progress: 6710 on 8876  Progress: 6711 on 8876  Progress: 6712 on 8876  Progress: 6713 on 8876  Progress: 6714 on 8876  Progress: 6715 on 8876  Progress: 6716 on 8876  Progress: 6717 on 8876  Progress: 6718 on 8876  Progress: 6719 on 8876  Progress: 6720 on 8876  Progress: 6721 on 8876  Progress: 6722 on 8876  Progress: 6723 on 8876  Progress: 6724 on 8876  Progress: 6725 on 8876  Progress: 6726 on 8876  Progress: 6727 on 8876  Progress: 6728 on 8876  Progress: 6729 on 8876  Progress: 6730 on 8876  Progress: 6731 on 8876  Progress: 6732 on 8876  Progress: 6733 on 8876  Progress: 6734 on 8876  Progress: 6735 on 8876  Progress: 6736 on 8876  Progress: 6737 on 8876  Progress: 6738 on 8876  Progress: 6739 on 8876  Progress: 6740 on 8876  Progress: 6741 on 8876  Progress: 6742 on 8876  Progress: 6743 on 8876  Progress: 6744 on 8876  Progress: 6745 on 8876  Progress: 6746 on 8876  Progress: 6747 on 8876  Progress: 6748 on 8876  Progress: 6749 on 8876  Progress: 6750 on 8876  Progress: 6751 on 8876  Progress: 6752 on 8876  Progress: 6753 on 8876  Progress: 6754 on 8876  Progress: 6755 on 8876  Progress: 6756 on 8876  Progress: 6757 on 8876  Progress: 6758 on 8876  Progress: 6759 on 8876  Progress: 6760 on 8876  Progress: 6761 on 8876  Progress: 6762 on 8876  Progress: 6763 on 8876  Progress: 6764 on 8876  Progress: 6765 on 8876  Progress: 6766 on 8876  Progress: 6767 on 8876  Progress: 6768 on 8876  Progress: 6769 on 8876  Progress: 6770 on 8876  Progress: 6771 on 8876  Progress: 6772 on 8876  Progress: 6773 on 8876  Progress: 6774 on 8876  Progress: 6775 on 8876  Progress: 6776 on 8876  Progress: 6777 on 8876  Progress: 6778 on 8876  Progress: 6779 on 8876  Progress: 6780 on 8876  Progress: 6781 on 8876  Progress: 6782 on 8876  Progress: 6783 on 8876  Progress: 6784 on 8876  Progress: 6785 on 8876  Progress: 6786 on 8876  Progress: 6787 on 8876  Progress: 6788 on 8876  Progress: 6789 on 8876  Progress: 6790 on 8876  Progress: 6791 on 8876  Progress: 6792 on 8876  Progress: 6793 on 8876  Progress: 6794 on 8876  Progress: 6795 on 8876  Progress: 6796 on 8876  Progress: 6797 on 8876  Progress: 6798 on 8876  Progress: 6799 on 8876  Progress: 6800 on 8876  Progress: 6801 on 8876  Progress: 6802 on 8876  Progress: 6803 on 8876  Progress: 6804 on 8876  Progress: 6805 on 8876  Progress: 6806 on 8876  Progress: 6807 on 8876  Progress: 6808 on 8876  Progress: 6809 on 8876  Progress: 6810 on 8876  Progress: 6811 on 8876  Progress: 6812 on 8876  Progress: 6813 on 8876  Progress: 6814 on 8876  Progress: 6815 on 8876  Progress: 6816 on 8876  Progress: 6817 on 8876  Progress: 6818 on 8876  Progress: 6819 on 8876  Progress: 6820 on 8876  Progress: 6821 on 8876  Progress: 6822 on 8876  Progress: 6823 on 8876  Progress: 6824 on 8876  Progress: 6825 on 8876  Progress: 6826 on 8876  Progress: 6827 on 8876  Progress: 6828 on 8876  Progress: 6829 on 8876  Progress: 6830 on 8876  Progress: 6831 on 8876  Progress: 6832 on 8876  Progress: 6833 on 8876  Progress: 6834 on 8876  Progress: 6835 on 8876  Progress: 6836 on 8876  Progress: 6837 on 8876  Progress: 6838 on 8876  Progress: 6839 on 8876  Progress: 6840 on 8876  Progress: 6841 on 8876  Progress: 6842 on 8876  Progress: 6843 on 8876  Progress: 6844 on 8876  Progress: 6845 on 8876  Progress: 6846 on 8876  Progress: 6847 on 8876  Progress: 6848 on 8876  Progress: 6849 on 8876  Progress: 6850 on 8876  Progress: 6851 on 8876  Progress: 6852 on 8876  Progress: 6853 on 8876  Progress: 6854 on 8876  Progress: 6855 on 8876  Progress: 6856 on 8876  Progress: 6857 on 8876  Progress: 6858 on 8876  Progress: 6859 on 8876  Progress: 6860 on 8876  Progress: 6861 on 8876  Progress: 6862 on 8876  Progress: 6863 on 8876  Progress: 6864 on 8876  Progress: 6865 on 8876  Progress: 6866 on 8876  Progress: 6867 on 8876  Progress: 6868 on 8876  Progress: 6869 on 8876  Progress: 6870 on 8876  Progress: 6871 on 8876  Progress: 6872 on 8876  Progress: 6873 on 8876  Progress: 6874 on 8876  Progress: 6875 on 8876  Progress: 6876 on 8876  Progress: 6877 on 8876  Progress: 6878 on 8876  Progress: 6879 on 8876  Progress: 6880 on 8876  Progress: 6881 on 8876  Progress: 6882 on 8876  Progress: 6883 on 8876  Progress: 6884 on 8876  Progress: 6885 on 8876  Progress: 6886 on 8876  Progress: 6887 on 8876  Progress: 6888 on 8876  Progress: 6889 on 8876  Progress: 6890 on 8876  Progress: 6891 on 8876  Progress: 6892 on 8876  Progress: 6893 on 8876  Progress: 6894 on 8876  Progress: 6895 on 8876  Progress: 6896 on 8876  Progress: 6897 on 8876  Progress: 6898 on 8876  Progress: 6899 on 8876  Progress: 6900 on 8876  Progress: 6901 on 8876  Progress: 6902 on 8876  Progress: 6903 on 8876  Progress: 6904 on 8876  Progress: 6905 on 8876  Progress: 6906 on 8876  Progress: 6907 on 8876  Progress: 6908 on 8876  Progress: 6909 on 8876  Progress: 6910 on 8876  Progress: 6911 on 8876  Progress: 6912 on 8876  Progress: 6913 on 8876  Progress: 6914 on 8876  Progress: 6915 on 8876  Progress: 6916 on 8876  Progress: 6917 on 8876  Progress: 6918 on 8876  Progress: 6919 on 8876  Progress: 6920 on 8876  Progress: 6921 on 8876  Progress: 6922 on 8876  Progress: 6923 on 8876  Progress: 6924 on 8876  Progress: 6925 on 8876  Progress: 6926 on 8876  Progress: 6927 on 8876  Progress: 6928 on 8876  Progress: 6929 on 8876  Progress: 6930 on 8876  Progress: 6931 on 8876  Progress: 6932 on 8876  Progress: 6933 on 8876  Progress: 6934 on 8876  Progress: 6935 on 8876  Progress: 6936 on 8876  Progress: 6937 on 8876  Progress: 6938 on 8876  Progress: 6939 on 8876  Progress: 6940 on 8876  Progress: 6941 on 8876  Progress: 6942 on 8876  Progress: 6943 on 8876  Progress: 6944 on 8876  Progress: 6945 on 8876  Progress: 6946 on 8876  Progress: 6947 on 8876  Progress: 6948 on 8876  Progress: 6949 on 8876  Progress: 6950 on 8876  Progress: 6951 on 8876  Progress: 6952 on 8876  Progress: 6953 on 8876  Progress: 6954 on 8876  Progress: 6955 on 8876  Progress: 6956 on 8876  Progress: 6957 on 8876  Progress: 6958 on 8876  Progress: 6959 on 8876  Progress: 6960 on 8876  Progress: 6961 on 8876  Progress: 6962 on 8876  Progress: 6963 on 8876  Progress: 6964 on 8876  Progress: 6965 on 8876  Progress: 6966 on 8876  Progress: 6967 on 8876  Progress: 6968 on 8876  Progress: 6969 on 8876  Progress: 6970 on 8876  Progress: 6971 on 8876  Progress: 6972 on 8876  Progress: 6973 on 8876  Progress: 6974 on 8876  Progress: 6975 on 8876  Progress: 6976 on 8876  Progress: 6977 on 8876  Progress: 6978 on 8876  Progress: 6979 on 8876  Progress: 6980 on 8876  Progress: 6981 on 8876  Progress: 6982 on 8876  Progress: 6983 on 8876  Progress: 6984 on 8876  Progress: 6985 on 8876  Progress: 6986 on 8876  Progress: 6987 on 8876  Progress: 6988 on 8876  Progress: 6989 on 8876  Progress: 6990 on 8876  Progress: 6991 on 8876  Progress: 6992 on 8876  Progress: 6993 on 8876  Progress: 6994 on 8876  Progress: 6995 on 8876  Progress: 6996 on 8876  Progress: 6997 on 8876  Progress: 6998 on 8876  Progress: 6999 on 8876  Progress: 7000 on 8876  Progress: 7001 on 8876  Progress: 7002 on 8876  Progress: 7003 on 8876  Progress: 7004 on 8876  Progress: 7005 on 8876  Progress: 7006 on 8876  Progress: 7007 on 8876  Progress: 7008 on 8876  Progress: 7009 on 8876  Progress: 7010 on 8876  Progress: 7011 on 8876  Progress: 7012 on 8876  Progress: 7013 on 8876  Progress: 7014 on 8876  Progress: 7015 on 8876  Progress: 7016 on 8876  Progress: 7017 on 8876  Progress: 7018 on 8876  Progress: 7019 on 8876  Progress: 7020 on 8876  Progress: 7021 on 8876  Progress: 7022 on 8876  Progress: 7023 on 8876  Progress: 7024 on 8876  Progress: 7025 on 8876  Progress: 7026 on 8876  Progress: 7027 on 8876  Progress: 7028 on 8876  Progress: 7029 on 8876  Progress: 7030 on 8876  Progress: 7031 on 8876  Progress: 7032 on 8876  Progress: 7033 on 8876  Progress: 7034 on 8876  Progress: 7035 on 8876  Progress: 7036 on 8876  Progress: 7037 on 8876  Progress: 7038 on 8876  Progress: 7039 on 8876  Progress: 7040 on 8876  Progress: 7041 on 8876  Progress: 7042 on 8876  Progress: 7043 on 8876  Progress: 7044 on 8876  Progress: 7045 on 8876  Progress: 7046 on 8876  Progress: 7047 on 8876  Progress: 7048 on 8876  Progress: 7049 on 8876  Progress: 7050 on 8876  Progress: 7051 on 8876  Progress: 7052 on 8876  Progress: 7053 on 8876  Progress: 7054 on 8876  Progress: 7055 on 8876  Progress: 7056 on 8876  Progress: 7057 on 8876  Progress: 7058 on 8876  Progress: 7059 on 8876  Progress: 7060 on 8876  Progress: 7061 on 8876  Progress: 7062 on 8876  Progress: 7063 on 8876  Progress: 7064 on 8876  Progress: 7065 on 8876  Progress: 7066 on 8876  Progress: 7067 on 8876  Progress: 7068 on 8876  Progress: 7069 on 8876  Progress: 7070 on 8876  Progress: 7071 on 8876  Progress: 7072 on 8876  Progress: 7073 on 8876  Progress: 7074 on 8876  Progress: 7075 on 8876  Progress: 7076 on 8876  Progress: 7077 on 8876  Progress: 7078 on 8876  Progress: 7079 on 8876  Progress: 7080 on 8876  Progress: 7081 on 8876  Progress: 7082 on 8876  Progress: 7083 on 8876  Progress: 7084 on 8876  Progress: 7085 on 8876  Progress: 7086 on 8876  Progress: 7087 on 8876  Progress: 7088 on 8876  Progress: 7089 on 8876  Progress: 7090 on 8876  Progress: 7091 on 8876  Progress: 7092 on 8876  Progress: 7093 on 8876  Progress: 7094 on 8876  Progress: 7095 on 8876  Progress: 7096 on 8876  Progress: 7097 on 8876  Progress: 7098 on 8876  Progress: 7099 on 8876  Progress: 7100 on 8876  Progress: 7101 on 8876  Progress: 7102 on 8876  Progress: 7103 on 8876  Progress: 7104 on 8876  Progress: 7105 on 8876  Progress: 7106 on 8876  Progress: 7107 on 8876  Progress: 7108 on 8876  Progress: 7109 on 8876  Progress: 7110 on 8876  Progress: 7111 on 8876  Progress: 7112 on 8876  Progress: 7113 on 8876  Progress: 7114 on 8876  Progress: 7115 on 8876  Progress: 7116 on 8876  Progress: 7117 on 8876  Progress: 7118 on 8876  Progress: 7119 on 8876  Progress: 7120 on 8876  Progress: 7121 on 8876  Progress: 7122 on 8876  Progress: 7123 on 8876  Progress: 7124 on 8876  Progress: 7125 on 8876  Progress: 7126 on 8876  Progress: 7127 on 8876  Progress: 7128 on 8876  Progress: 7129 on 8876  Progress: 7130 on 8876  Progress: 7131 on 8876  Progress: 7132 on 8876  Progress: 7133 on 8876  Progress: 7134 on 8876  Progress: 7135 on 8876  Progress: 7136 on 8876  Progress: 7137 on 8876  Progress: 7138 on 8876  Progress: 7139 on 8876  Progress: 7140 on 8876  Progress: 7141 on 8876  Progress: 7142 on 8876  Progress: 7143 on 8876  Progress: 7144 on 8876  Progress: 7145 on 8876  Progress: 7146 on 8876  Progress: 7147 on 8876  Progress: 7148 on 8876  Progress: 7149 on 8876  Progress: 7150 on 8876  Progress: 7151 on 8876  Progress: 7152 on 8876  Progress: 7153 on 8876  Progress: 7154 on 8876  Progress: 7155 on 8876  Progress: 7156 on 8876  Progress: 7157 on 8876  Progress: 7158 on 8876  Progress: 7159 on 8876  Progress: 7160 on 8876  Progress: 7161 on 8876  Progress: 7162 on 8876  Progress: 7163 on 8876  Progress: 7164 on 8876  Progress: 7165 on 8876  Progress: 7166 on 8876  Progress: 7167 on 8876  Progress: 7168 on 8876  Progress: 7169 on 8876  Progress: 7170 on 8876  Progress: 7171 on 8876  Progress: 7172 on 8876  Progress: 7173 on 8876  Progress: 7174 on 8876  Progress: 7175 on 8876  Progress: 7176 on 8876  Progress: 7177 on 8876  Progress: 7178 on 8876  Progress: 7179 on 8876  Progress: 7180 on 8876  Progress: 7181 on 8876  Progress: 7182 on 8876  Progress: 7183 on 8876  Progress: 7184 on 8876  Progress: 7185 on 8876  Progress: 7186 on 8876  Progress: 7187 on 8876  Progress: 7188 on 8876  Progress: 7189 on 8876  Progress: 7190 on 8876  Progress: 7191 on 8876  Progress: 7192 on 8876  Progress: 7193 on 8876  Progress: 7194 on 8876  Progress: 7195 on 8876  Progress: 7196 on 8876  Progress: 7197 on 8876  Progress: 7198 on 8876  Progress: 7199 on 8876  Progress: 7200 on 8876  Progress: 7201 on 8876  Progress: 7202 on 8876  Progress: 7203 on 8876  Progress: 7204 on 8876  Progress: 7205 on 8876  Progress: 7206 on 8876  Progress: 7207 on 8876  Progress: 7208 on 8876  Progress: 7209 on 8876  Progress: 7210 on 8876  Progress: 7211 on 8876  Progress: 7212 on 8876  Progress: 7213 on 8876  Progress: 7214 on 8876  Progress: 7215 on 8876  Progress: 7216 on 8876  Progress: 7217 on 8876  Progress: 7218 on 8876  Progress: 7219 on 8876  Progress: 7220 on 8876  Progress: 7221 on 8876  Progress: 7222 on 8876  Progress: 7223 on 8876  Progress: 7224 on 8876  Progress: 7225 on 8876  Progress: 7226 on 8876  Progress: 7227 on 8876  Progress: 7228 on 8876  Progress: 7229 on 8876  Progress: 7230 on 8876  Progress: 7231 on 8876  Progress: 7232 on 8876  Progress: 7233 on 8876  Progress: 7234 on 8876  Progress: 7235 on 8876  Progress: 7236 on 8876  Progress: 7237 on 8876  Progress: 7238 on 8876  Progress: 7239 on 8876  Progress: 7240 on 8876  Progress: 7241 on 8876  Progress: 7242 on 8876  Progress: 7243 on 8876  Progress: 7244 on 8876  Progress: 7245 on 8876  Progress: 7246 on 8876  Progress: 7247 on 8876  Progress: 7248 on 8876  Progress: 7249 on 8876  Progress: 7250 on 8876  Progress: 7251 on 8876  Progress: 7252 on 8876  Progress: 7253 on 8876  Progress: 7254 on 8876  Progress: 7255 on 8876  Progress: 7256 on 8876  Progress: 7257 on 8876  Progress: 7258 on 8876  Progress: 7259 on 8876  Progress: 7260 on 8876  Progress: 7261 on 8876  Progress: 7262 on 8876  Progress: 7263 on 8876  Progress: 7264 on 8876  Progress: 7265 on 8876  Progress: 7266 on 8876  Progress: 7267 on 8876  Progress: 7268 on 8876  Progress: 7269 on 8876  Progress: 7270 on 8876  Progress: 7271 on 8876  Progress: 7272 on 8876  Progress: 7273 on 8876  Progress: 7274 on 8876  Progress: 7275 on 8876  Progress: 7276 on 8876  Progress: 7277 on 8876  Progress: 7278 on 8876  Progress: 7279 on 8876  Progress: 7280 on 8876  Progress: 7281 on 8876  Progress: 7282 on 8876  Progress: 7283 on 8876  Progress: 7284 on 8876  Progress: 7285 on 8876  Progress: 7286 on 8876  Progress: 7287 on 8876  Progress: 7288 on 8876  Progress: 7289 on 8876  Progress: 7290 on 8876  Progress: 7291 on 8876  Progress: 7292 on 8876  Progress: 7293 on 8876  Progress: 7294 on 8876  Progress: 7295 on 8876  Progress: 7296 on 8876  Progress: 7297 on 8876  Progress: 7298 on 8876  Progress: 7299 on 8876  Progress: 7300 on 8876  Progress: 7301 on 8876  Progress: 7302 on 8876  Progress: 7303 on 8876  Progress: 7304 on 8876  Progress: 7305 on 8876  Progress: 7306 on 8876  Progress: 7307 on 8876  Progress: 7308 on 8876  Progress: 7309 on 8876  Progress: 7310 on 8876  Progress: 7311 on 8876  Progress: 7312 on 8876  Progress: 7313 on 8876  Progress: 7314 on 8876  Progress: 7315 on 8876  Progress: 7316 on 8876  Progress: 7317 on 8876  Progress: 7318 on 8876  Progress: 7319 on 8876  Progress: 7320 on 8876  Progress: 7321 on 8876  Progress: 7322 on 8876  Progress: 7323 on 8876  Progress: 7324 on 8876  Progress: 7325 on 8876  Progress: 7326 on 8876  Progress: 7327 on 8876  Progress: 7328 on 8876  Progress: 7329 on 8876  Progress: 7330 on 8876  Progress: 7331 on 8876  Progress: 7332 on 8876  Progress: 7333 on 8876  Progress: 7334 on 8876  Progress: 7335 on 8876  Progress: 7336 on 8876  Progress: 7337 on 8876  Progress: 7338 on 8876  Progress: 7339 on 8876  Progress: 7340 on 8876  Progress: 7341 on 8876  Progress: 7342 on 8876  Progress: 7343 on 8876  Progress: 7344 on 8876  Progress: 7345 on 8876  Progress: 7346 on 8876  Progress: 7347 on 8876  Progress: 7348 on 8876  Progress: 7349 on 8876  Progress: 7350 on 8876  Progress: 7351 on 8876  Progress: 7352 on 8876  Progress: 7353 on 8876  Progress: 7354 on 8876  Progress: 7355 on 8876  Progress: 7356 on 8876  Progress: 7357 on 8876  Progress: 7358 on 8876  Progress: 7359 on 8876  Progress: 7360 on 8876  Progress: 7361 on 8876  Progress: 7362 on 8876  Progress: 7363 on 8876  Progress: 7364 on 8876  Progress: 7365 on 8876  Progress: 7366 on 8876  Progress: 7367 on 8876  Progress: 7368 on 8876  Progress: 7369 on 8876  Progress: 7370 on 8876  Progress: 7371 on 8876  Progress: 7372 on 8876  Progress: 7373 on 8876  Progress: 7374 on 8876  Progress: 7375 on 8876  Progress: 7376 on 8876  Progress: 7377 on 8876  Progress: 7378 on 8876  Progress: 7379 on 8876  Progress: 7380 on 8876  Progress: 7381 on 8876  Progress: 7382 on 8876  Progress: 7383 on 8876  Progress: 7384 on 8876  Progress: 7385 on 8876  Progress: 7386 on 8876  Progress: 7387 on 8876  Progress: 7388 on 8876  Progress: 7389 on 8876  Progress: 7390 on 8876  Progress: 7391 on 8876  Progress: 7392 on 8876  Progress: 7393 on 8876  Progress: 7394 on 8876  Progress: 7395 on 8876  Progress: 7396 on 8876  Progress: 7397 on 8876  Progress: 7398 on 8876  Progress: 7399 on 8876  Progress: 7400 on 8876  Progress: 7401 on 8876  Progress: 7402 on 8876  Progress: 7403 on 8876  Progress: 7404 on 8876  Progress: 7405 on 8876  Progress: 7406 on 8876  Progress: 7407 on 8876  Progress: 7408 on 8876  Progress: 7409 on 8876  Progress: 7410 on 8876  Progress: 7411 on 8876  Progress: 7412 on 8876  Progress: 7413 on 8876  Progress: 7414 on 8876  Progress: 7415 on 8876  Progress: 7416 on 8876  Progress: 7417 on 8876  Progress: 7418 on 8876  Progress: 7419 on 8876  Progress: 7420 on 8876  Progress: 7421 on 8876  Progress: 7422 on 8876  Progress: 7423 on 8876  Progress: 7424 on 8876  Progress: 7425 on 8876  Progress: 7426 on 8876  Progress: 7427 on 8876  Progress: 7428 on 8876  Progress: 7429 on 8876  Progress: 7430 on 8876  Progress: 7431 on 8876  Progress: 7432 on 8876  Progress: 7433 on 8876  Progress: 7434 on 8876  Progress: 7435 on 8876  Progress: 7436 on 8876  Progress: 7437 on 8876  Progress: 7438 on 8876  Progress: 7439 on 8876  Progress: 7440 on 8876  Progress: 7441 on 8876  Progress: 7442 on 8876  Progress: 7443 on 8876  Progress: 7444 on 8876  Progress: 7445 on 8876  Progress: 7446 on 8876  Progress: 7447 on 8876  Progress: 7448 on 8876  Progress: 7449 on 8876  Progress: 7450 on 8876  Progress: 7451 on 8876  Progress: 7452 on 8876  Progress: 7453 on 8876  Progress: 7454 on 8876  Progress: 7455 on 8876  Progress: 7456 on 8876  Progress: 7457 on 8876  Progress: 7458 on 8876  Progress: 7459 on 8876  Progress: 7460 on 8876  Progress: 7461 on 8876  Progress: 7462 on 8876  Progress: 7463 on 8876  Progress: 7464 on 8876  Progress: 7465 on 8876  Progress: 7466 on 8876  Progress: 7467 on 8876  Progress: 7468 on 8876  Progress: 7469 on 8876  Progress: 7470 on 8876  Progress: 7471 on 8876  Progress: 7472 on 8876  Progress: 7473 on 8876  Progress: 7474 on 8876  Progress: 7475 on 8876  Progress: 7476 on 8876  Progress: 7477 on 8876  Progress: 7478 on 8876  Progress: 7479 on 8876  Progress: 7480 on 8876  Progress: 7481 on 8876  Progress: 7482 on 8876  Progress: 7483 on 8876  Progress: 7484 on 8876  Progress: 7485 on 8876  Progress: 7486 on 8876  Progress: 7487 on 8876  Progress: 7488 on 8876  Progress: 7489 on 8876  Progress: 7490 on 8876  Progress: 7491 on 8876  Progress: 7492 on 8876  Progress: 7493 on 8876  Progress: 7494 on 8876  Progress: 7495 on 8876  Progress: 7496 on 8876  Progress: 7497 on 8876  Progress: 7498 on 8876  Progress: 7499 on 8876  Progress: 7500 on 8876  Progress: 7501 on 8876  Progress: 7502 on 8876  Progress: 7503 on 8876  Progress: 7504 on 8876  Progress: 7505 on 8876  Progress: 7506 on 8876  Progress: 7507 on 8876  Progress: 7508 on 8876  Progress: 7509 on 8876  Progress: 7510 on 8876  Progress: 7511 on 8876  Progress: 7512 on 8876  Progress: 7513 on 8876  Progress: 7514 on 8876  Progress: 7515 on 8876  Progress: 7516 on 8876  Progress: 7517 on 8876  Progress: 7518 on 8876  Progress: 7519 on 8876  Progress: 7520 on 8876  Progress: 7521 on 8876  Progress: 7522 on 8876  Progress: 7523 on 8876  Progress: 7524 on 8876  Progress: 7525 on 8876  Progress: 7526 on 8876  Progress: 7527 on 8876  Progress: 7528 on 8876  Progress: 7529 on 8876  Progress: 7530 on 8876  Progress: 7531 on 8876  Progress: 7532 on 8876  Progress: 7533 on 8876  Progress: 7534 on 8876  Progress: 7535 on 8876  Progress: 7536 on 8876  Progress: 7537 on 8876  Progress: 7538 on 8876  Progress: 7539 on 8876  Progress: 7540 on 8876  Progress: 7541 on 8876  Progress: 7542 on 8876  Progress: 7543 on 8876  Progress: 7544 on 8876  Progress: 7545 on 8876  Progress: 7546 on 8876  Progress: 7547 on 8876  Progress: 7548 on 8876  Progress: 7549 on 8876  Progress: 7550 on 8876  Progress: 7551 on 8876  Progress: 7552 on 8876  Progress: 7553 on 8876  Progress: 7554 on 8876  Progress: 7555 on 8876  Progress: 7556 on 8876  Progress: 7557 on 8876  Progress: 7558 on 8876  Progress: 7559 on 8876  Progress: 7560 on 8876  Progress: 7561 on 8876  Progress: 7562 on 8876  Progress: 7563 on 8876  Progress: 7564 on 8876  Progress: 7565 on 8876  Progress: 7566 on 8876  Progress: 7567 on 8876  Progress: 7568 on 8876  Progress: 7569 on 8876  Progress: 7570 on 8876  Progress: 7571 on 8876  Progress: 7572 on 8876  Progress: 7573 on 8876  Progress: 7574 on 8876  Progress: 7575 on 8876  Progress: 7576 on 8876  Progress: 7577 on 8876  Progress: 7578 on 8876  Progress: 7579 on 8876  Progress: 7580 on 8876  Progress: 7581 on 8876  Progress: 7582 on 8876  Progress: 7583 on 8876  Progress: 7584 on 8876  Progress: 7585 on 8876  Progress: 7586 on 8876  Progress: 7587 on 8876  Progress: 7588 on 8876  Progress: 7589 on 8876  Progress: 7590 on 8876  Progress: 7591 on 8876  Progress: 7592 on 8876  Progress: 7593 on 8876  Progress: 7594 on 8876  Progress: 7595 on 8876  Progress: 7596 on 8876  Progress: 7597 on 8876  Progress: 7598 on 8876  Progress: 7599 on 8876  Progress: 7600 on 8876  Progress: 7601 on 8876  Progress: 7602 on 8876  Progress: 7603 on 8876  Progress: 7604 on 8876  Progress: 7605 on 8876  Progress: 7606 on 8876  Progress: 7607 on 8876  Progress: 7608 on 8876  Progress: 7609 on 8876  Progress: 7610 on 8876  Progress: 7611 on 8876  Progress: 7612 on 8876  Progress: 7613 on 8876  Progress: 7614 on 8876  Progress: 7615 on 8876  Progress: 7616 on 8876  Progress: 7617 on 8876  Progress: 7618 on 8876  Progress: 7619 on 8876  Progress: 7620 on 8876  Progress: 7621 on 8876  Progress: 7622 on 8876  Progress: 7623 on 8876  Progress: 7624 on 8876  Progress: 7625 on 8876  Progress: 7626 on 8876  Progress: 7627 on 8876  Progress: 7628 on 8876  Progress: 7629 on 8876  Progress: 7630 on 8876  Progress: 7631 on 8876  Progress: 7632 on 8876  Progress: 7633 on 8876  Progress: 7634 on 8876  Progress: 7635 on 8876  Progress: 7636 on 8876  Progress: 7637 on 8876  Progress: 7638 on 8876  Progress: 7639 on 8876  Progress: 7640 on 8876  Progress: 7641 on 8876  Progress: 7642 on 8876  Progress: 7643 on 8876  Progress: 7644 on 8876  Progress: 7645 on 8876  Progress: 7646 on 8876  Progress: 7647 on 8876  Progress: 7648 on 8876  Progress: 7649 on 8876  Progress: 7650 on 8876  Progress: 7651 on 8876  Progress: 7652 on 8876  Progress: 7653 on 8876  Progress: 7654 on 8876  Progress: 7655 on 8876  Progress: 7656 on 8876  Progress: 7657 on 8876  Progress: 7658 on 8876  Progress: 7659 on 8876  Progress: 7660 on 8876  Progress: 7661 on 8876  Progress: 7662 on 8876  Progress: 7663 on 8876  Progress: 7664 on 8876  Progress: 7665 on 8876  Progress: 7666 on 8876  Progress: 7667 on 8876  Progress: 7668 on 8876  Progress: 7669 on 8876  Progress: 7670 on 8876  Progress: 7671 on 8876  Progress: 7672 on 8876  Progress: 7673 on 8876  Progress: 7674 on 8876  Progress: 7675 on 8876  Progress: 7676 on 8876  Progress: 7677 on 8876  Progress: 7678 on 8876  Progress: 7679 on 8876  Progress: 7680 on 8876  Progress: 7681 on 8876  Progress: 7682 on 8876  Progress: 7683 on 8876  Progress: 7684 on 8876  Progress: 7685 on 8876  Progress: 7686 on 8876  Progress: 7687 on 8876  Progress: 7688 on 8876  Progress: 7689 on 8876  Progress: 7690 on 8876  Progress: 7691 on 8876  Progress: 7692 on 8876  Progress: 7693 on 8876  Progress: 7694 on 8876  Progress: 7695 on 8876  Progress: 7696 on 8876  Progress: 7697 on 8876  Progress: 7698 on 8876  Progress: 7699 on 8876  Progress: 7700 on 8876  Progress: 7701 on 8876  Progress: 7702 on 8876  Progress: 7703 on 8876  Progress: 7704 on 8876  Progress: 7705 on 8876  Progress: 7706 on 8876  Progress: 7707 on 8876  Progress: 7708 on 8876  Progress: 7709 on 8876  Progress: 7710 on 8876  Progress: 7711 on 8876  Progress: 7712 on 8876  Progress: 7713 on 8876  Progress: 7714 on 8876  Progress: 7715 on 8876  Progress: 7716 on 8876  Progress: 7717 on 8876  Progress: 7718 on 8876  Progress: 7719 on 8876  Progress: 7720 on 8876  Progress: 7721 on 8876  Progress: 7722 on 8876  Progress: 7723 on 8876  Progress: 7724 on 8876  Progress: 7725 on 8876  Progress: 7726 on 8876  Progress: 7727 on 8876  Progress: 7728 on 8876  Progress: 7729 on 8876  Progress: 7730 on 8876  Progress: 7731 on 8876  Progress: 7732 on 8876  Progress: 7733 on 8876  Progress: 7734 on 8876  Progress: 7735 on 8876  Progress: 7736 on 8876  Progress: 7737 on 8876  Progress: 7738 on 8876  Progress: 7739 on 8876  Progress: 7740 on 8876  Progress: 7741 on 8876  Progress: 7742 on 8876  Progress: 7743 on 8876  Progress: 7744 on 8876  Progress: 7745 on 8876  Progress: 7746 on 8876  Progress: 7747 on 8876  Progress: 7748 on 8876  Progress: 7749 on 8876  Progress: 7750 on 8876  Progress: 7751 on 8876  Progress: 7752 on 8876  Progress: 7753 on 8876  Progress: 7754 on 8876  Progress: 7755 on 8876  Progress: 7756 on 8876  Progress: 7757 on 8876  Progress: 7758 on 8876  Progress: 7759 on 8876  Progress: 7760 on 8876  Progress: 7761 on 8876  Progress: 7762 on 8876  Progress: 7763 on 8876  Progress: 7764 on 8876  Progress: 7765 on 8876  Progress: 7766 on 8876  Progress: 7767 on 8876  Progress: 7768 on 8876  Progress: 7769 on 8876  Progress: 7770 on 8876  Progress: 7771 on 8876  Progress: 7772 on 8876  Progress: 7773 on 8876  Progress: 7774 on 8876  Progress: 7775 on 8876  Progress: 7776 on 8876  Progress: 7777 on 8876  Progress: 7778 on 8876  Progress: 7779 on 8876  Progress: 7780 on 8876  Progress: 7781 on 8876  Progress: 7782 on 8876  Progress: 7783 on 8876  Progress: 7784 on 8876  Progress: 7785 on 8876  Progress: 7786 on 8876  Progress: 7787 on 8876  Progress: 7788 on 8876  Progress: 7789 on 8876  Progress: 7790 on 8876  Progress: 7791 on 8876  Progress: 7792 on 8876  Progress: 7793 on 8876  Progress: 7794 on 8876  Progress: 7795 on 8876  Progress: 7796 on 8876  Progress: 7797 on 8876  Progress: 7798 on 8876  Progress: 7799 on 8876  Progress: 7800 on 8876  Progress: 7801 on 8876  Progress: 7802 on 8876  Progress: 7803 on 8876  Progress: 7804 on 8876  Progress: 7805 on 8876  Progress: 7806 on 8876  Progress: 7807 on 8876  Progress: 7808 on 8876  Progress: 7809 on 8876  Progress: 7810 on 8876  Progress: 7811 on 8876  Progress: 7812 on 8876  Progress: 7813 on 8876  Progress: 7814 on 8876  Progress: 7815 on 8876  Progress: 7816 on 8876  Progress: 7817 on 8876  Progress: 7818 on 8876  Progress: 7819 on 8876  Progress: 7820 on 8876  Progress: 7821 on 8876  Progress: 7822 on 8876  Progress: 7823 on 8876  Progress: 7824 on 8876  Progress: 7825 on 8876  Progress: 7826 on 8876  Progress: 7827 on 8876  Progress: 7828 on 8876  Progress: 7829 on 8876  Progress: 7830 on 8876  Progress: 7831 on 8876  Progress: 7832 on 8876  Progress: 7833 on 8876  Progress: 7834 on 8876  Progress: 7835 on 8876  Progress: 7836 on 8876  Progress: 7837 on 8876  Progress: 7838 on 8876  Progress: 7839 on 8876  Progress: 7840 on 8876  Progress: 7841 on 8876  Progress: 7842 on 8876  Progress: 7843 on 8876  Progress: 7844 on 8876  Progress: 7845 on 8876  Progress: 7846 on 8876  Progress: 7847 on 8876  Progress: 7848 on 8876  Progress: 7849 on 8876  Progress: 7850 on 8876  Progress: 7851 on 8876  Progress: 7852 on 8876  Progress: 7853 on 8876  Progress: 7854 on 8876  Progress: 7855 on 8876  Progress: 7856 on 8876  Progress: 7857 on 8876  Progress: 7858 on 8876  Progress: 7859 on 8876  Progress: 7860 on 8876  Progress: 7861 on 8876  Progress: 7862 on 8876  Progress: 7863 on 8876  Progress: 7864 on 8876  Progress: 7865 on 8876  Progress: 7866 on 8876  Progress: 7867 on 8876  Progress: 7868 on 8876  Progress: 7869 on 8876  Progress: 7870 on 8876  Progress: 7871 on 8876  Progress: 7872 on 8876  Progress: 7873 on 8876  Progress: 7874 on 8876  Progress: 7875 on 8876  Progress: 7876 on 8876  Progress: 7877 on 8876  Progress: 7878 on 8876  Progress: 7879 on 8876  Progress: 7880 on 8876  Progress: 7881 on 8876  Progress: 7882 on 8876  Progress: 7883 on 8876  Progress: 7884 on 8876  Progress: 7885 on 8876  Progress: 7886 on 8876  Progress: 7887 on 8876  Progress: 7888 on 8876  Progress: 7889 on 8876  Progress: 7890 on 8876  Progress: 7891 on 8876  Progress: 7892 on 8876  Progress: 7893 on 8876  Progress: 7894 on 8876  Progress: 7895 on 8876  Progress: 7896 on 8876  Progress: 7897 on 8876  Progress: 7898 on 8876  Progress: 7899 on 8876  Progress: 7900 on 8876  Progress: 7901 on 8876  Progress: 7902 on 8876  Progress: 7903 on 8876  Progress: 7904 on 8876  Progress: 7905 on 8876  Progress: 7906 on 8876  Progress: 7907 on 8876  Progress: 7908 on 8876  Progress: 7909 on 8876  Progress: 7910 on 8876  Progress: 7911 on 8876  Progress: 7912 on 8876  Progress: 7913 on 8876  Progress: 7914 on 8876  Progress: 7915 on 8876  Progress: 7916 on 8876  Progress: 7917 on 8876  Progress: 7918 on 8876  Progress: 7919 on 8876  Progress: 7920 on 8876  Progress: 7921 on 8876  Progress: 7922 on 8876  Progress: 7923 on 8876  Progress: 7924 on 8876  Progress: 7925 on 8876  Progress: 7926 on 8876  Progress: 7927 on 8876  Progress: 7928 on 8876  Progress: 7929 on 8876  Progress: 7930 on 8876  Progress: 7931 on 8876  Progress: 7932 on 8876  Progress: 7933 on 8876  Progress: 7934 on 8876  Progress: 7935 on 8876  Progress: 7936 on 8876  Progress: 7937 on 8876  Progress: 7938 on 8876  Progress: 7939 on 8876  Progress: 7940 on 8876  Progress: 7941 on 8876  Progress: 7942 on 8876  Progress: 7943 on 8876  Progress: 7944 on 8876  Progress: 7945 on 8876  Progress: 7946 on 8876  Progress: 7947 on 8876  Progress: 7948 on 8876  Progress: 7949 on 8876  Progress: 7950 on 8876  Progress: 7951 on 8876  Progress: 7952 on 8876  Progress: 7953 on 8876  Progress: 7954 on 8876  Progress: 7955 on 8876  Progress: 7956 on 8876  Progress: 7957 on 8876  Progress: 7958 on 8876  Progress: 7959 on 8876  Progress: 7960 on 8876  Progress: 7961 on 8876  Progress: 7962 on 8876  Progress: 7963 on 8876  Progress: 7964 on 8876  Progress: 7965 on 8876  Progress: 7966 on 8876  Progress: 7967 on 8876  Progress: 7968 on 8876  Progress: 7969 on 8876  Progress: 7970 on 8876  Progress: 7971 on 8876  Progress: 7972 on 8876  Progress: 7973 on 8876  Progress: 7974 on 8876  Progress: 7975 on 8876  Progress: 7976 on 8876  Progress: 7977 on 8876  Progress: 7978 on 8876  Progress: 7979 on 8876  Progress: 7980 on 8876  Progress: 7981 on 8876  Progress: 7982 on 8876  Progress: 7983 on 8876  Progress: 7984 on 8876  Progress: 7985 on 8876  Progress: 7986 on 8876  Progress: 7987 on 8876  Progress: 7988 on 8876  Progress: 7989 on 8876  Progress: 7990 on 8876  Progress: 7991 on 8876  Progress: 7992 on 8876  Progress: 7993 on 8876  Progress: 7994 on 8876  Progress: 7995 on 8876  Progress: 7996 on 8876  Progress: 7997 on 8876  Progress: 7998 on 8876  Progress: 7999 on 8876  Progress: 8000 on 8876  Progress: 8001 on 8876  Progress: 8002 on 8876  Progress: 8003 on 8876  Progress: 8004 on 8876  Progress: 8005 on 8876  Progress: 8006 on 8876  Progress: 8007 on 8876  Progress: 8008 on 8876  Progress: 8009 on 8876  Progress: 8010 on 8876  Progress: 8011 on 8876  Progress: 8012 on 8876  Progress: 8013 on 8876  Progress: 8014 on 8876  Progress: 8015 on 8876  Progress: 8016 on 8876  Progress: 8017 on 8876  Progress: 8018 on 8876  Progress: 8019 on 8876  Progress: 8020 on 8876  Progress: 8021 on 8876  Progress: 8022 on 8876  Progress: 8023 on 8876  Progress: 8024 on 8876  Progress: 8025 on 8876  Progress: 8026 on 8876  Progress: 8027 on 8876  Progress: 8028 on 8876  Progress: 8029 on 8876  Progress: 8030 on 8876  Progress: 8031 on 8876  Progress: 8032 on 8876  Progress: 8033 on 8876  Progress: 8034 on 8876  Progress: 8035 on 8876  Progress: 8036 on 8876  Progress: 8037 on 8876  Progress: 8038 on 8876  Progress: 8039 on 8876  Progress: 8040 on 8876  Progress: 8041 on 8876  Progress: 8042 on 8876  Progress: 8043 on 8876  Progress: 8044 on 8876  Progress: 8045 on 8876  Progress: 8046 on 8876  Progress: 8047 on 8876  Progress: 8048 on 8876  Progress: 8049 on 8876  Progress: 8050 on 8876  Progress: 8051 on 8876  Progress: 8052 on 8876  Progress: 8053 on 8876  Progress: 8054 on 8876  Progress: 8055 on 8876  Progress: 8056 on 8876  Progress: 8057 on 8876  Progress: 8058 on 8876  Progress: 8059 on 8876  Progress: 8060 on 8876  Progress: 8061 on 8876  Progress: 8062 on 8876  Progress: 8063 on 8876  Progress: 8064 on 8876  Progress: 8065 on 8876  Progress: 8066 on 8876  Progress: 8067 on 8876  Progress: 8068 on 8876  Progress: 8069 on 8876  Progress: 8070 on 8876  Progress: 8071 on 8876  Progress: 8072 on 8876  Progress: 8073 on 8876  Progress: 8074 on 8876  Progress: 8075 on 8876  Progress: 8076 on 8876  Progress: 8077 on 8876  Progress: 8078 on 8876  Progress: 8079 on 8876  Progress: 8080 on 8876  Progress: 8081 on 8876  Progress: 8082 on 8876  Progress: 8083 on 8876  Progress: 8084 on 8876  Progress: 8085 on 8876  Progress: 8086 on 8876  Progress: 8087 on 8876  Progress: 8088 on 8876  Progress: 8089 on 8876  Progress: 8090 on 8876  Progress: 8091 on 8876  Progress: 8092 on 8876  Progress: 8093 on 8876  Progress: 8094 on 8876  Progress: 8095 on 8876  Progress: 8096 on 8876  Progress: 8097 on 8876  Progress: 8098 on 8876  Progress: 8099 on 8876  Progress: 8100 on 8876  Progress: 8101 on 8876  Progress: 8102 on 8876  Progress: 8103 on 8876  Progress: 8104 on 8876  Progress: 8105 on 8876  Progress: 8106 on 8876  Progress: 8107 on 8876  Progress: 8108 on 8876  Progress: 8109 on 8876  Progress: 8110 on 8876  Progress: 8111 on 8876  Progress: 8112 on 8876  Progress: 8113 on 8876  Progress: 8114 on 8876  Progress: 8115 on 8876  Progress: 8116 on 8876  Progress: 8117 on 8876  Progress: 8118 on 8876  Progress: 8119 on 8876  Progress: 8120 on 8876  Progress: 8121 on 8876  Progress: 8122 on 8876  Progress: 8123 on 8876  Progress: 8124 on 8876  Progress: 8125 on 8876  Progress: 8126 on 8876  Progress: 8127 on 8876  Progress: 8128 on 8876  Progress: 8129 on 8876  Progress: 8130 on 8876  Progress: 8131 on 8876  Progress: 8132 on 8876  Progress: 8133 on 8876  Progress: 8134 on 8876  Progress: 8135 on 8876  Progress: 8136 on 8876  Progress: 8137 on 8876  Progress: 8138 on 8876  Progress: 8139 on 8876  Progress: 8140 on 8876  Progress: 8141 on 8876  Progress: 8142 on 8876  Progress: 8143 on 8876  Progress: 8144 on 8876  Progress: 8145 on 8876  Progress: 8146 on 8876  Progress: 8147 on 8876  Progress: 8148 on 8876  Progress: 8149 on 8876  Progress: 8150 on 8876  Progress: 8151 on 8876  Progress: 8152 on 8876  Progress: 8153 on 8876  Progress: 8154 on 8876  Progress: 8155 on 8876  Progress: 8156 on 8876  Progress: 8157 on 8876  Progress: 8158 on 8876  Progress: 8159 on 8876  Progress: 8160 on 8876  Progress: 8161 on 8876  Progress: 8162 on 8876  Progress: 8163 on 8876  Progress: 8164 on 8876  Progress: 8165 on 8876  Progress: 8166 on 8876  Progress: 8167 on 8876  Progress: 8168 on 8876  Progress: 8169 on 8876  Progress: 8170 on 8876  Progress: 8171 on 8876  Progress: 8172 on 8876  Progress: 8173 on 8876  Progress: 8174 on 8876  Progress: 8175 on 8876  Progress: 8176 on 8876  Progress: 8177 on 8876  Progress: 8178 on 8876  Progress: 8179 on 8876  Progress: 8180 on 8876  Progress: 8181 on 8876  Progress: 8182 on 8876  Progress: 8183 on 8876  Progress: 8184 on 8876  Progress: 8185 on 8876  Progress: 8186 on 8876  Progress: 8187 on 8876  Progress: 8188 on 8876  Progress: 8189 on 8876  Progress: 8190 on 8876  Progress: 8191 on 8876  Progress: 8192 on 8876  Progress: 8193 on 8876  Progress: 8194 on 8876  Progress: 8195 on 8876  Progress: 8196 on 8876  Progress: 8197 on 8876  Progress: 8198 on 8876  Progress: 8199 on 8876  Progress: 8200 on 8876  Progress: 8201 on 8876  Progress: 8202 on 8876  Progress: 8203 on 8876  Progress: 8204 on 8876  Progress: 8205 on 8876  Progress: 8206 on 8876  Progress: 8207 on 8876  Progress: 8208 on 8876  Progress: 8209 on 8876  Progress: 8210 on 8876  Progress: 8211 on 8876  Progress: 8212 on 8876  Progress: 8213 on 8876  Progress: 8214 on 8876  Progress: 8215 on 8876  Progress: 8216 on 8876  Progress: 8217 on 8876  Progress: 8218 on 8876  Progress: 8219 on 8876  Progress: 8220 on 8876  Progress: 8221 on 8876  Progress: 8222 on 8876  Progress: 8223 on 8876  Progress: 8224 on 8876  Progress: 8225 on 8876  Progress: 8226 on 8876  Progress: 8227 on 8876  Progress: 8228 on 8876  Progress: 8229 on 8876  Progress: 8230 on 8876  Progress: 8231 on 8876  Progress: 8232 on 8876  Progress: 8233 on 8876  Progress: 8234 on 8876  Progress: 8235 on 8876  Progress: 8236 on 8876  Progress: 8237 on 8876  Progress: 8238 on 8876  Progress: 8239 on 8876  Progress: 8240 on 8876  Progress: 8241 on 8876  Progress: 8242 on 8876  Progress: 8243 on 8876  Progress: 8244 on 8876  Progress: 8245 on 8876  Progress: 8246 on 8876  Progress: 8247 on 8876  Progress: 8248 on 8876  Progress: 8249 on 8876  Progress: 8250 on 8876  Progress: 8251 on 8876  Progress: 8252 on 8876  Progress: 8253 on 8876  Progress: 8254 on 8876  Progress: 8255 on 8876  Progress: 8256 on 8876  Progress: 8257 on 8876  Progress: 8258 on 8876  Progress: 8259 on 8876  Progress: 8260 on 8876  Progress: 8261 on 8876  Progress: 8262 on 8876  Progress: 8263 on 8876  Progress: 8264 on 8876  Progress: 8265 on 8876  Progress: 8266 on 8876  Progress: 8267 on 8876  Progress: 8268 on 8876  Progress: 8269 on 8876  Progress: 8270 on 8876  Progress: 8271 on 8876  Progress: 8272 on 8876  Progress: 8273 on 8876  Progress: 8274 on 8876  Progress: 8275 on 8876  Progress: 8276 on 8876  Progress: 8277 on 8876  Progress: 8278 on 8876  Progress: 8279 on 8876  Progress: 8280 on 8876  Progress: 8281 on 8876  Progress: 8282 on 8876  Progress: 8283 on 8876  Progress: 8284 on 8876  Progress: 8285 on 8876  Progress: 8286 on 8876  Progress: 8287 on 8876  Progress: 8288 on 8876  Progress: 8289 on 8876  Progress: 8290 on 8876  Progress: 8291 on 8876  Progress: 8292 on 8876  Progress: 8293 on 8876  Progress: 8294 on 8876  Progress: 8295 on 8876  Progress: 8296 on 8876  Progress: 8297 on 8876  Progress: 8298 on 8876  Progress: 8299 on 8876  Progress: 8300 on 8876  Progress: 8301 on 8876  Progress: 8302 on 8876  Progress: 8303 on 8876  Progress: 8304 on 8876  Progress: 8305 on 8876  Progress: 8306 on 8876  Progress: 8307 on 8876  Progress: 8308 on 8876  Progress: 8309 on 8876  Progress: 8310 on 8876  Progress: 8311 on 8876  Progress: 8312 on 8876  Progress: 8313 on 8876  Progress: 8314 on 8876  Progress: 8315 on 8876  Progress: 8316 on 8876  Progress: 8317 on 8876  Progress: 8318 on 8876  Progress: 8319 on 8876  Progress: 8320 on 8876  Progress: 8321 on 8876  Progress: 8322 on 8876  Progress: 8323 on 8876  Progress: 8324 on 8876  Progress: 8325 on 8876  Progress: 8326 on 8876  Progress: 8327 on 8876  Progress: 8328 on 8876  Progress: 8329 on 8876  Progress: 8330 on 8876  Progress: 8331 on 8876  Progress: 8332 on 8876  Progress: 8333 on 8876  Progress: 8334 on 8876  Progress: 8335 on 8876  Progress: 8336 on 8876  Progress: 8337 on 8876  Progress: 8338 on 8876  Progress: 8339 on 8876  Progress: 8340 on 8876  Progress: 8341 on 8876  Progress: 8342 on 8876  Progress: 8343 on 8876  Progress: 8344 on 8876  Progress: 8345 on 8876  Progress: 8346 on 8876  Progress: 8347 on 8876  Progress: 8348 on 8876  Progress: 8349 on 8876  Progress: 8350 on 8876  Progress: 8351 on 8876  Progress: 8352 on 8876  Progress: 8353 on 8876  Progress: 8354 on 8876  Progress: 8355 on 8876  Progress: 8356 on 8876  Progress: 8357 on 8876  Progress: 8358 on 8876  Progress: 8359 on 8876  Progress: 8360 on 8876  Progress: 8361 on 8876  Progress: 8362 on 8876  Progress: 8363 on 8876  Progress: 8364 on 8876  Progress: 8365 on 8876  Progress: 8366 on 8876  Progress: 8367 on 8876  Progress: 8368 on 8876  Progress: 8369 on 8876  Progress: 8370 on 8876  Progress: 8371 on 8876  Progress: 8372 on 8876  Progress: 8373 on 8876  Progress: 8374 on 8876  Progress: 8375 on 8876  Progress: 8376 on 8876  Progress: 8377 on 8876  Progress: 8378 on 8876  Progress: 8379 on 8876  Progress: 8380 on 8876  Progress: 8381 on 8876  Progress: 8382 on 8876  Progress: 8383 on 8876  Progress: 8384 on 8876  Progress: 8385 on 8876  Progress: 8386 on 8876  Progress: 8387 on 8876  Progress: 8388 on 8876  Progress: 8389 on 8876  Progress: 8390 on 8876  Progress: 8391 on 8876  Progress: 8392 on 8876  Progress: 8393 on 8876  Progress: 8394 on 8876  Progress: 8395 on 8876  Progress: 8396 on 8876  Progress: 8397 on 8876  Progress: 8398 on 8876  Progress: 8399 on 8876  Progress: 8400 on 8876  Progress: 8401 on 8876  Progress: 8402 on 8876  Progress: 8403 on 8876  Progress: 8404 on 8876  Progress: 8405 on 8876  Progress: 8406 on 8876  Progress: 8407 on 8876  Progress: 8408 on 8876  Progress: 8409 on 8876  Progress: 8410 on 8876  Progress: 8411 on 8876  Progress: 8412 on 8876  Progress: 8413 on 8876  Progress: 8414 on 8876  Progress: 8415 on 8876  Progress: 8416 on 8876  Progress: 8417 on 8876  Progress: 8418 on 8876  Progress: 8419 on 8876  Progress: 8420 on 8876  Progress: 8421 on 8876  Progress: 8422 on 8876  Progress: 8423 on 8876  Progress: 8424 on 8876  Progress: 8425 on 8876  Progress: 8426 on 8876  Progress: 8427 on 8876  Progress: 8428 on 8876  Progress: 8429 on 8876  Progress: 8430 on 8876  Progress: 8431 on 8876  Progress: 8432 on 8876  Progress: 8433 on 8876  Progress: 8434 on 8876  Progress: 8435 on 8876  Progress: 8436 on 8876  Progress: 8437 on 8876  Progress: 8438 on 8876  Progress: 8439 on 8876  Progress: 8440 on 8876  Progress: 8441 on 8876  Progress: 8442 on 8876  Progress: 8443 on 8876  Progress: 8444 on 8876  Progress: 8445 on 8876  Progress: 8446 on 8876  Progress: 8447 on 8876  Progress: 8448 on 8876  Progress: 8449 on 8876  Progress: 8450 on 8876  Progress: 8451 on 8876  Progress: 8452 on 8876  Progress: 8453 on 8876  Progress: 8454 on 8876  Progress: 8455 on 8876  Progress: 8456 on 8876  Progress: 8457 on 8876  Progress: 8458 on 8876  Progress: 8459 on 8876  Progress: 8460 on 8876  Progress: 8461 on 8876  Progress: 8462 on 8876  Progress: 8463 on 8876  Progress: 8464 on 8876  Progress: 8465 on 8876  Progress: 8466 on 8876  Progress: 8467 on 8876  Progress: 8468 on 8876  Progress: 8469 on 8876  Progress: 8470 on 8876  Progress: 8471 on 8876  Progress: 8472 on 8876  Progress: 8473 on 8876  Progress: 8474 on 8876  Progress: 8475 on 8876  Progress: 8476 on 8876  Progress: 8477 on 8876  Progress: 8478 on 8876  Progress: 8479 on 8876  Progress: 8480 on 8876  Progress: 8481 on 8876  Progress: 8482 on 8876  Progress: 8483 on 8876  Progress: 8484 on 8876  Progress: 8485 on 8876  Progress: 8486 on 8876  Progress: 8487 on 8876  Progress: 8488 on 8876  Progress: 8489 on 8876  Progress: 8490 on 8876  Progress: 8491 on 8876  Progress: 8492 on 8876  Progress: 8493 on 8876  Progress: 8494 on 8876  Progress: 8495 on 8876  Progress: 8496 on 8876  Progress: 8497 on 8876  Progress: 8498 on 8876  Progress: 8499 on 8876  Progress: 8500 on 8876  Progress: 8501 on 8876  Progress: 8502 on 8876  Progress: 8503 on 8876  Progress: 8504 on 8876  Progress: 8505 on 8876  Progress: 8506 on 8876  Progress: 8507 on 8876  Progress: 8508 on 8876  Progress: 8509 on 8876  Progress: 8510 on 8876  Progress: 8511 on 8876  Progress: 8512 on 8876  Progress: 8513 on 8876  Progress: 8514 on 8876  Progress: 8515 on 8876  Progress: 8516 on 8876  Progress: 8517 on 8876  Progress: 8518 on 8876  Progress: 8519 on 8876  Progress: 8520 on 8876  Progress: 8521 on 8876  Progress: 8522 on 8876  Progress: 8523 on 8876  Progress: 8524 on 8876  Progress: 8525 on 8876  Progress: 8526 on 8876  Progress: 8527 on 8876  Progress: 8528 on 8876  Progress: 8529 on 8876  Progress: 8530 on 8876  Progress: 8531 on 8876  Progress: 8532 on 8876  Progress: 8533 on 8876  Progress: 8534 on 8876  Progress: 8535 on 8876  Progress: 8536 on 8876  Progress: 8537 on 8876  Progress: 8538 on 8876  Progress: 8539 on 8876  Progress: 8540 on 8876  Progress: 8541 on 8876  Progress: 8542 on 8876  Progress: 8543 on 8876  Progress: 8544 on 8876  Progress: 8545 on 8876  Progress: 8546 on 8876  Progress: 8547 on 8876  Progress: 8548 on 8876  Progress: 8549 on 8876  Progress: 8550 on 8876  Progress: 8551 on 8876  Progress: 8552 on 8876  Progress: 8553 on 8876  Progress: 8554 on 8876  Progress: 8555 on 8876  Progress: 8556 on 8876  Progress: 8557 on 8876  Progress: 8558 on 8876  Progress: 8559 on 8876  Progress: 8560 on 8876  Progress: 8561 on 8876  Progress: 8562 on 8876  Progress: 8563 on 8876  Progress: 8564 on 8876  Progress: 8565 on 8876  Progress: 8566 on 8876  Progress: 8567 on 8876  Progress: 8568 on 8876  Progress: 8569 on 8876  Progress: 8570 on 8876  Progress: 8571 on 8876  Progress: 8572 on 8876  Progress: 8573 on 8876  Progress: 8574 on 8876  Progress: 8575 on 8876  Progress: 8576 on 8876  Progress: 8577 on 8876  Progress: 8578 on 8876  Progress: 8579 on 8876  Progress: 8580 on 8876  Progress: 8581 on 8876  Progress: 8582 on 8876  Progress: 8583 on 8876  Progress: 8584 on 8876  Progress: 8585 on 8876  Progress: 8586 on 8876  Progress: 8587 on 8876  Progress: 8588 on 8876  Progress: 8589 on 8876  Progress: 8590 on 8876  Progress: 8591 on 8876  Progress: 8592 on 8876  Progress: 8593 on 8876  Progress: 8594 on 8876  Progress: 8595 on 8876  Progress: 8596 on 8876  Progress: 8597 on 8876  Progress: 8598 on 8876  Progress: 8599 on 8876  Progress: 8600 on 8876  Progress: 8601 on 8876  Progress: 8602 on 8876  Progress: 8603 on 8876  Progress: 8604 on 8876  Progress: 8605 on 8876  Progress: 8606 on 8876  Progress: 8607 on 8876  Progress: 8608 on 8876  Progress: 8609 on 8876  Progress: 8610 on 8876  Progress: 8611 on 8876  Progress: 8612 on 8876  Progress: 8613 on 8876  Progress: 8614 on 8876  Progress: 8615 on 8876  Progress: 8616 on 8876  Progress: 8617 on 8876  Progress: 8618 on 8876  Progress: 8619 on 8876  Progress: 8620 on 8876  Progress: 8621 on 8876  Progress: 8622 on 8876  Progress: 8623 on 8876  Progress: 8624 on 8876  Progress: 8625 on 8876  Progress: 8626 on 8876  Progress: 8627 on 8876  Progress: 8628 on 8876  Progress: 8629 on 8876  Progress: 8630 on 8876  Progress: 8631 on 8876  Progress: 8632 on 8876  Progress: 8633 on 8876  Progress: 8634 on 8876  Progress: 8635 on 8876  Progress: 8636 on 8876  Progress: 8637 on 8876  Progress: 8638 on 8876  Progress: 8639 on 8876  Progress: 8640 on 8876  Progress: 8641 on 8876  Progress: 8642 on 8876  Progress: 8643 on 8876  Progress: 8644 on 8876  Progress: 8645 on 8876  Progress: 8646 on 8876  Progress: 8647 on 8876  Progress: 8648 on 8876  Progress: 8649 on 8876  Progress: 8650 on 8876  Progress: 8651 on 8876  Progress: 8652 on 8876  Progress: 8653 on 8876  Progress: 8654 on 8876  Progress: 8655 on 8876  Progress: 8656 on 8876  Progress: 8657 on 8876  Progress: 8658 on 8876  Progress: 8659 on 8876  Progress: 8660 on 8876  Progress: 8661 on 8876  Progress: 8662 on 8876  Progress: 8663 on 8876  Progress: 8664 on 8876  Progress: 8665 on 8876  Progress: 8666 on 8876  Progress: 8667 on 8876  Progress: 8668 on 8876  Progress: 8669 on 8876  Progress: 8670 on 8876  Progress: 8671 on 8876  Progress: 8672 on 8876  Progress: 8673 on 8876  Progress: 8674 on 8876  Progress: 8675 on 8876  Progress: 8676 on 8876  Progress: 8677 on 8876  Progress: 8678 on 8876  Progress: 8679 on 8876  Progress: 8680 on 8876  Progress: 8681 on 8876  Progress: 8682 on 8876  Progress: 8683 on 8876  Progress: 8684 on 8876  Progress: 8685 on 8876  Progress: 8686 on 8876  Progress: 8687 on 8876  Progress: 8688 on 8876  Progress: 8689 on 8876  Progress: 8690 on 8876  Progress: 8691 on 8876  Progress: 8692 on 8876  Progress: 8693 on 8876  Progress: 8694 on 8876  Progress: 8695 on 8876  Progress: 8696 on 8876  Progress: 8697 on 8876  Progress: 8698 on 8876  Progress: 8699 on 8876  Progress: 8700 on 8876  Progress: 8701 on 8876  Progress: 8702 on 8876  Progress: 8703 on 8876  Progress: 8704 on 8876  Progress: 8705 on 8876  Progress: 8706 on 8876  Progress: 8707 on 8876  Progress: 8708 on 8876  Progress: 8709 on 8876  Progress: 8710 on 8876  Progress: 8711 on 8876  Progress: 8712 on 8876  Progress: 8713 on 8876  Progress: 8714 on 8876  Progress: 8715 on 8876  Progress: 8716 on 8876  Progress: 8717 on 8876  Progress: 8718 on 8876  Progress: 8719 on 8876  Progress: 8720 on 8876  Progress: 8721 on 8876  Progress: 8722 on 8876  Progress: 8723 on 8876  Progress: 8724 on 8876  Progress: 8725 on 8876  Progress: 8726 on 8876  Progress: 8727 on 8876  Progress: 8728 on 8876  Progress: 8729 on 8876  Progress: 8730 on 8876  Progress: 8731 on 8876  Progress: 8732 on 8876  Progress: 8733 on 8876  Progress: 8734 on 8876  Progress: 8735 on 8876  Progress: 8736 on 8876  Progress: 8737 on 8876  Progress: 8738 on 8876  Progress: 8739 on 8876  Progress: 8740 on 8876  Progress: 8741 on 8876  Progress: 8742 on 8876  Progress: 8743 on 8876  Progress: 8744 on 8876  Progress: 8745 on 8876  Progress: 8746 on 8876  Progress: 8747 on 8876  Progress: 8748 on 8876  Progress: 8749 on 8876  Progress: 8750 on 8876  Progress: 8751 on 8876  Progress: 8752 on 8876  Progress: 8753 on 8876  Progress: 8754 on 8876  Progress: 8755 on 8876  Progress: 8756 on 8876  Progress: 8757 on 8876  Progress: 8758 on 8876  Progress: 8759 on 8876  Progress: 8760 on 8876  Progress: 8761 on 8876  Progress: 8762 on 8876  Progress: 8763 on 8876  Progress: 8764 on 8876  Progress: 8765 on 8876  Progress: 8766 on 8876  Progress: 8767 on 8876  Progress: 8768 on 8876  Progress: 8769 on 8876  Progress: 8770 on 8876  Progress: 8771 on 8876  Progress: 8772 on 8876  Progress: 8773 on 8876  Progress: 8774 on 8876  Progress: 8775 on 8876  Progress: 8776 on 8876  Progress: 8777 on 8876  Progress: 8778 on 8876  Progress: 8779 on 8876  Progress: 8780 on 8876  Progress: 8781 on 8876  Progress: 8782 on 8876  Progress: 8783 on 8876  Progress: 8784 on 8876  Progress: 8785 on 8876  Progress: 8786 on 8876  Progress: 8787 on 8876  Progress: 8788 on 8876  Progress: 8789 on 8876  Progress: 8790 on 8876  Progress: 8791 on 8876  Progress: 8792 on 8876  Progress: 8793 on 8876  Progress: 8794 on 8876  Progress: 8795 on 8876  Progress: 8796 on 8876  Progress: 8797 on 8876  Progress: 8798 on 8876  Progress: 8799 on 8876  Progress: 8800 on 8876  Progress: 8801 on 8876  Progress: 8802 on 8876  Progress: 8803 on 8876  Progress: 8804 on 8876  Progress: 8805 on 8876  Progress: 8806 on 8876  Progress: 8807 on 8876  Progress: 8808 on 8876  Progress: 8809 on 8876  Progress: 8810 on 8876  Progress: 8811 on 8876  Progress: 8812 on 8876  Progress: 8813 on 8876  Progress: 8814 on 8876  Progress: 8815 on 8876  Progress: 8816 on 8876  Progress: 8817 on 8876  Progress: 8818 on 8876  Progress: 8819 on 8876  Progress: 8820 on 8876  Progress: 8821 on 8876  Progress: 8822 on 8876  Progress: 8823 on 8876  Progress: 8824 on 8876  Progress: 8825 on 8876  Progress: 8826 on 8876  Progress: 8827 on 8876  Progress: 8828 on 8876  Progress: 8829 on 8876  Progress: 8830 on 8876  Progress: 8831 on 8876  Progress: 8832 on 8876  Progress: 8833 on 8876  Progress: 8834 on 8876  Progress: 8835 on 8876  Progress: 8836 on 8876  Progress: 8837 on 8876  Progress: 8838 on 8876  Progress: 8839 on 8876  Progress: 8840 on 8876  Progress: 8841 on 8876  Progress: 8842 on 8876  Progress: 8843 on 8876  Progress: 8844 on 8876  Progress: 8845 on 8876  Progress: 8846 on 8876  Progress: 8847 on 8876  Progress: 8848 on 8876  Progress: 8849 on 8876  Progress: 8850 on 8876  Progress: 8851 on 8876  Progress: 8852 on 8876  Progress: 8853 on 8876  Progress: 8854 on 8876  Progress: 8855 on 8876  Progress: 8856 on 8876  Progress: 8857 on 8876  Progress: 8858 on 8876  Progress: 8859 on 8876  Progress: 8860 on 8876  Progress: 8861 on 8876  Progress: 8862 on 8876  Progress: 8863 on 8876  Progress: 8864 on 8876  Progress: 8865 on 8876  Progress: 8866 on 8876  Progress: 8867 on 8876  Progress: 8868 on 8876  Progress: 8869 on 8876  Progress: 8870 on 8876  Progress: 8871 on 8876  Progress: 8872 on 8876  Progress: 8873 on 8876  Progress: 8874 on 8876  Progress: 8875 on 8876  Progress: 8876 on 8876  
za_instytucja <- za_instytucja %>%
  filter(is.na(czy_nazwisko)&is.na(czy_imie)) %>%
  filter(instytucja!="") %>%
  filter(!grepl("^\\[[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]|^[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]",instytucja)) %>%
  mutate(instytucja = str_remove(instytucja,"\\.$")) %>%
  select(ZA_UWAGI,instytucja) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#10: wydawnictwo
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI, X260) %>%
  mutate(X260 = str_replace_all(X260,"s\\.n\\.", "b.w."), 
         X260 = str_replace_all(X260,"s\\.l\\.", "b.m."), 
         X260 = str_replace_all(X260,"S\\.l\\.", "b.m."), 
         X260 = str_remove(X260,"^\\\\+"), 
         rok_wydania = str_extract_all(X260, "(?<=\\$c).*(?=\\$e)|(?<=\\$c).*"), 
         bez_roku = str_replace_all(X260, ".\\$c.*", ""), 
         ile_wydawnictw = str_count(bez_roku, "\\$b"),
         ile_miejsc = str_count(bez_roku, "\\$a"),
         kolejnosc = str_replace_all(as.character(str_extract_all(bez_roku, "\\$.")), "[^a-z]", ""),
         bez_roku = str_replace_all(bez_roku, ";\\$b", ":$b"),
         wydaw_podziel = ifelse(ile_wydawnictw>ile_miejsc|kolejnosc=="caabb", str_replace_all(bez_roku, "(\\$a)(.*?)( :\\$b.*?)( :\\$b)", "\\1\\2\\3 ;$a\\2\\4"),bez_roku),
         wydawnictwo_test = str_replace_all(wydaw_podziel, "(\\$b)(.*?)( ;\\$a)", "\\1\\2|\\3")) %>%
  select(ZA_UWAGI,rok_wydania,wydawnictwo_test) %>%
  cSplit(., "wydawnictwo_test", sep = "|", direction = "long") %>%
  mutate(wydawnictwo = str_extract_all(wydawnictwo_test, "(?<=\\$b)(.*)"),
         miejsce_wydania = str_replace_all(str_extract_all(wydawnictwo_test, "(?<=\\$a)(.*)(?= {0,1}: {0,1}\\$b)|(?<=\\$a)(.*)($)")," ;\\$a", ", "),
         nazwa_prosta = str_to_lower(str_replace_all(str_replace_all(unlist(wydawnictwo_test), "\\$\\w", ""), "\\W", ""))) %>%
  left_join(.,PBL_wydawnictwa,by="nazwa_prosta") %>%
  mutate(to_samo = wydawnictwo==WY_NAZWA) %>%
  arrange(ZA_UWAGI,-to_samo,-WY_LICZBA_ZAPISOW)
BN_wydawnictwo$id_grupy <- cumsum(!duplicated(BN_wydawnictwo[1:3]))
BN_wydawnictwo <- BN_wydawnictwo[!duplicated(BN_wydawnictwo$id_grupy),] %>%
  mutate(WY_NAZWA = ifelse(!is.na(WY_NAZWA),as.character(WY_NAZWA),as.character(wydawnictwo)),
         WY_MIASTO = ifelse(!is.na(WY_MIASTO),as.character(WY_MIASTO),trim(as.character(miejsce_wydania))),
         rok_wydania = str_replace_all(rok_wydania, "(.*)(\\.)", "\\1"),
         za_rok_wydania = ifelse(nchar(rok_wydania)==4,as.character(rok_wydania),NA),
         do_opisu = ifelse(is.na(za_rok_wydania),paste("[",str_extract(rok_wydania,"\\d{4}"),"]",sep = ""),""),
         WY_MIASTO = ifelse(substr(WY_MIASTO,1,1)=="["&substr(WY_MIASTO,nchar(WY_MIASTO),nchar(WY_MIASTO))!="]"&is.na(WY_WYDAWNICTWO_ID),paste(trim(WY_MIASTO),"]",sep = ""),as.character(WY_MIASTO))) %>%
  select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania,do_opisu) %>% 
  mutate(WY_NAZWA = ifelse(str_count(WY_NAZWA, "\\[")>str_count(WY_NAZWA, "\\]"), paste(WY_NAZWA, "]", sep = ""),
                           ifelse(str_count(WY_NAZWA, "\\[")<str_count(WY_NAZWA, "\\]"), paste("[", WY_NAZWA, sep = ""), as.character(WY_NAZWA))),
         WY_MIASTO = ifelse(str_count(WY_MIASTO, "\\[")>str_count(WY_MIASTO, "\\]"), paste(WY_MIASTO, "]", sep = ""),
                           ifelse(str_count(WY_MIASTO, "\\[")<str_count(WY_MIASTO, "\\]"), paste("[", WY_MIASTO, sep = ""), as.character(WY_MIASTO))))
argument is not an atomic vector; coercing
#11: opis fizyczny książki
#pole 300 do opisu fizycznego
marc_field_300 <- data %>%
  select(ZA_UWAGI,X300)%>%
  filter(X300!="") %>%
  mutate(X300=str_replace_all(X300,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X300",sep = "~",direction = "long") %>%
  filter(X300!="") %>%
  mutate(X300=str_remove_all(X300,"^\\|")) %>%
  mutate(indicator = str_replace_all(X300,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X300,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_300)[1]))
colnames(empty_table) <-subfield_list
marc_field_300<-cbind(marc_field_300,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_300$X300 <- str_replace(marc_field_300$X300,subfield_list_char[i],"|\\1")
}
Progress: 1 on 4  Progress: 2 on 4  Progress: 3 on 4  Progress: 4 on 4  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_300[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_300$X300),str_replace_all(gsub(string,"\\3",marc_field_300$X300),"\\${2}.", "~"),NA)
}
Progress: 1 on 4  Progress: 2 on 4  Progress: 3 on 4  Progress: 4 on 4  
marc_field_300 <- marc_field_300 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$b` = str_remove(`$b`," \\;+$| \\:+$"),
         `$e` = ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`)&grepl("\\+ dysk|płyt",`$e`),str_extract(`$e`,"(?<=\\+)(dysk|płyt.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),
                       ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`),str_extract(`$e`,"(^.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),NA)),
         `$a` = ifelse(is.na(`$a`),"",as.character(`$a`)),
         `$b` = ifelse(is.na(`$b`),"",as.character(`$b`)),
         `$e` = ifelse(is.na(`$e`),"",as.character(`$e`)))
#pole 500 do opisu fizycznego
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
marc_field_500 <- marc_field_500 %>%
  mutate(`$a` = ifelse(grepl("oryg(\\.|\\,)",X500)&grepl("pseud|nazwa",X500,ignore.case = TRUE),str_replace(`$a`,"(^.*?)(\\. )(\\p{Lu}.*$)","\\3"),as.character(`$a`))) %>% 
  filter(!grepl("oryg(\\.|\\,)",`$a`)&grepl("pseud|nazwa|dotycz|pol",`$a`,ignore.case = TRUE)) %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))

#pole 546 do opisu fizycznego
marc_field_546 <- data %>%
  select(ZA_UWAGI,X546)%>%
  filter(X546!="") %>%
  mutate(X546=str_replace_all(X546,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X546",sep = "~",direction = "long") %>%
  filter(X546!="") %>%
  mutate(X546=str_remove_all(X546,"^\\|")) %>%
  mutate(indicator = str_replace_all(X546,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X546,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_546)[1]))
colnames(empty_table) <-subfield_list
marc_field_546<-cbind(marc_field_546,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_546$X546 <- str_replace(marc_field_546$X546,subfield_list_char[i],"|\\1")
}
Progress: 1 on 2  Progress: 2 on 2  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_546[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_546$X546),str_replace_all(gsub(string,"\\3",marc_field_546$X546),"\\${2}.", "~"),NA)
}
Progress: 1 on 2  Progress: 2 on 2  
marc_field_546 <- marc_field_546 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))

#pole 501 do opisu fizycznego
marc_field_501 <- data %>%
  select(ZA_UWAGI,X501)%>%
  filter(X501!="") %>%
  mutate(X501=str_replace_all(X501,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X501",sep = "~",direction = "long") %>%
  filter(X501!="") %>%
  mutate(X501=str_remove_all(X501,"^\\|")) %>%
  mutate(indicator = str_replace_all(X501,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X501,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_501)[1]))
colnames(empty_table) <-subfield_list
marc_field_501<-cbind(marc_field_501,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_501$X501 <- str_replace(marc_field_501$X501,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_501[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_501$X501),str_replace_all(gsub(string,"\\3",marc_field_501$X501),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
marc_field_501 <- marc_field_501 %>%
  select(ZA_UWAGI, `$a`)

za_opis_ks <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,do_opisu),by="ZA_UWAGI") %>%
  left_join(.,marc_field_300 %>% select(ZA_UWAGI,X300a=`$a`,X300b=`$b`,X300e=`$e`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_500 %>% select(ZA_UWAGI,X500a=`$a`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_546 %>% select(ZA_UWAGI,X546a=`$a`),by="ZA_UWAGI") %>% 
  left_join(.,marc_field_501 %>% select(ZA_UWAGI,X501a=`$a`),by="ZA_UWAGI")
za_opis_ks[is.na(za_opis_ks)]  <- ""
za_opis_ks <- za_opis_ks %>%
  mutate(za_opis_ks = paste(ifelse(do_opisu!="",paste(as.character(do_opisu),", ",sep = ""),""),ifelse(X300a!="",paste(as.character(X300a),", ",sep = ""),""),ifelse(X300b!="",paste(as.character(X300b),", ",sep = ""),""),ifelse(X300e!="",paste(as.character(X300e),", ",sep = ""),""),ifelse(X500a!="",paste(as.character(X500a),", ",sep = ""),""),ifelse(X546a!="",as.character(X546a),""),ifelse(X501a!="",as.character(X501a),""),sep = ""),
         za_opis_ks = str_remove(za_opis_ks,"(, )+$")) %>%
  select(ZA_UWAGI,za_opis_ks) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(za_opis_ks))
za_opis_ks$id_grupy <- cumsum(!duplicated(za_opis_ks[1]))
za_opis_ks <- za_opis_ks[!duplicated(za_opis_ks$id_grupy),] %>%
  select(-id_grupy)

#12: seria wydawnicza
marc_field_490 <- data %>%
  select(ZA_UWAGI,X490,X800,X830) %>%
  mutate(X490 = ifelse(grepl("U\\+",X490),as.character(X830),as.character(X490))) %>%
  mutate(X800 = ifelse(X490!="","",as.character(X800)),
         X830 = ifelse(X490!="","",as.character(X830)),
         X800 = str_replace(X800,"(\\$a)(.*)(\\$t)","\\1"),
         X490 = ifelse(X490==""&X830!="",as.character(X830),
                       ifelse(X490==""&X800!="",as.character(X800),as.character(X490)))) %>%
  select(ZA_UWAGI,X490) %>%
  filter(X490!="") %>%
  mutate(X490=str_replace_all(X490,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X490",sep = "~",direction = "long") %>%
  filter(X490!="") %>%
  mutate(X490=str_remove_all(X490,"^\\|")) %>%
  mutate(indicator = str_replace_all(X490,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X490,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_490)[1]))
colnames(empty_table) <-subfield_list
marc_field_490<-cbind(marc_field_490,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_490$X490 <- str_replace(marc_field_490$X490,subfield_list_char[i],"|\\1")
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_490[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_490$X490),str_replace_all(gsub(string,"\\3",marc_field_490$X490),"\\${2}.", "~"),NA)
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
za_seria_wydawnicza <- marc_field_490 %>%
  mutate(`$a` = str_replace_all(`$a`,"(=)(\\$a)","\\1 "),
         `$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$v` = ifelse(is.na(`$v`),"",as.character(`$v`))) %>%
  filter(!is.na(`$a`)) %>%
  mutate(seria = str_remove(paste("(",`$a`,"; ",`$v`,")",sep = ""),"; (?=\\)$)"),
         seria = gsub("( : )(.)",". \\U\\2",perl=TRUE,seria)) %>%
  select(ZA_UWAGI,seria) %>%
  group_by(ZA_UWAGI) %>%
  mutate(seria = paste(seria,collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(seria = str_replace_all(seria,"\\$.","; ")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#13: tomy
za_tomy <- data %>%
  select(ZA_UWAGI) %>%
  mutate(za_tomy = NA)

#14: adnotacje
za_adnotacje <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_autor %>% select(ZA_UWAGI,ZA_ADNOTACJE),by="ZA_UWAGI") %>%
  left_join(.,BN_wspoltworca %>% select(ZA_UWAGI,ZA_ADNOTACJE),by="ZA_UWAGI") %>%
  mutate(ZA_ADNOTACJE = paste(ifelse(is.na(ZA_ADNOTACJE.x),"",paste(as.character(ZA_ADNOTACJE.x),"# ",sep = "")),ifelse(is.na(ZA_ADNOTACJE.y),"",as.character(ZA_ADNOTACJE.y)),sep = ""),
         ZA_ADNOTACJE = str_remove(ZA_ADNOTACJE,"(# )+$")) %>%
  select(ZA_UWAGI,ZA_ADNOTACJE) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(ZA_ADNOTACJE))
za_adnotacje$id_grupy <- cumsum(!duplicated(za_adnotacje[1]))
za_adnotacje <- za_adnotacje[!duplicated(za_adnotacje$id_grupy),] %>%
  select(-id_grupy)

#15: BN_URL
BN_URL <- data %>%
  select(ZA_UWAGI,BN_URL)

#wyrównanie liczby wierszy do liczby wierszy obiektu data
BN_autor <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_autor %>% select(ZA_UWAGI,AM_AUTOR_ID,AM_NAZWISKO,AM_IMIE),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, AM_AUTOR_ID = paste(AM_AUTOR_ID, collapse="|"), AM_NAZWISKO = paste(AM_NAZWISKO, collapse="|"), AM_IMIE = paste(AM_IMIE, collapse="|"))
BN_wspoltworca <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wspoltworca %>% select(ZA_UWAGI,OS_OSOBA_ID,OS_NAZWISKO,OS_IMIE,fo_symbol),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, OS_OSOBA_ID = paste(OS_OSOBA_ID, collapse="|"), OS_NAZWISKO = paste(OS_NAZWISKO, collapse="|"), OS_IMIE = paste(OS_IMIE, collapse="|"), fo_symbol = paste(fo_symbol, collapse="|")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL","NA",as.character(fo_symbol)))
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, WY_WYDAWNICTWO_ID = paste(WY_WYDAWNICTWO_ID, collapse="|"), WY_NAZWA = paste(WY_NAZWA, collapse="|"), WY_MIASTO = paste(WY_MIASTO, collapse="|"), za_rok_wydania = paste(unique(za_rok_wydania), collapse="|")) %>%
  mutate(za_rok_wydania = ifelse(za_rok_wydania=="NA","",as.integer(za_rok_wydania)))
pojawi戼㸳y si攼㹡 warto㤼㹣ci NA na skutek przekszta戼㸳cenia
#połączenie wszystkich elementów w jedną tabelę
kolejnosc <- data.frame(kolejnosc=c("ZA_UWAGI","RZ_NAZWA","ZA_RO_ROK","ZA_TYPE","RZ_RODZAJ_ID","DZ_NAZWA","DZ_DZIAL_ID","TW_TWORCA_ID","AM_AUTOR_ID","AM_NAZWISKO","AM_IMIE","ZA_TYTUL","ZA_TYTUL_ORYGINALU","ZA_JEZYK_ORYGINALU","OS_OSOBA_ID","OS_NAZWISKO","OS_IMIE","fo_symbol","za_opis_wspoltworcow","wydanie","za_tomy","instytucja","WY_WYDAWNICTWO_ID","WY_MIASTO","WY_NAZWA","za_rok_wydania","za_opis_ks","seria","TW_NAZWISKO","TW_IMIE","redaktor_dzialu","ZA_ADNOTACJE","BN_URL"))
polaczone <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,pola_pbl,by = "ZA_UWAGI") %>%
  left_join(.,BN_autor,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,za_jezyk_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,BN_wspoltworca,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_wspoltworcow,by = "ZA_UWAGI") %>%
  left_join(.,za_wydanie,by = "ZA_UWAGI") %>%
  left_join(.,za_instytucja,by = "ZA_UWAGI") %>%
  left_join(.,BN_wydawnictwo,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_ks,by = "ZA_UWAGI") %>%
  left_join(.,za_seria_wydawnicza,by = "ZA_UWAGI") %>%
  left_join(.,za_tomy,by = "ZA_UWAGI") %>%
  left_join(.,za_adnotacje,by = "ZA_UWAGI") %>%
  left_join(.,BN_URL,by = "ZA_UWAGI") %>%
  select(as.vector(kolejnosc$kolejnosc))
colnames(polaczone) <- c("rekord_BN","rz_nazwa","za_ro_rok","za_type","rz_rodzaj_id","DZ_NAZWA","DZ_DZIAL_ID","tw_tworca_id","am_autor_id","am_nazwisko","am_imie","za_tytul","za_tytul_oryginalu","za_jezyk_oryginalu","os_osoba_id","os_nazwisko","os_imie","fo_symbol","za_opis_wspoltworcow","za_wydanie","za_tomy","za_instytucja","wy_wydawnictwo_id","wy_miejsce","wy_nazwa","za_rok_wydania","za_opis_fizyczny_ksiazki","za_seria_wydawnicza","tw_nazwisko","tw_imie","pracownik","za_adnotacje","BN_URL")

#zasygnalizowanie niepoprawnego kodowania
x <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("<U\\+(....)>",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)!=0,paste(polaczone$za_adnotacje,paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole.",sep = ""),sep = "# "),paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole.",sep = "")),as.character(polaczone$za_adnotacje))
  polaczone[,i] <- gsub("<U\\+(....)>", "???", polaczone[,i])
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności znaku $ w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("\\$",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności frazy "character(0)" w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("character\\(0\\)",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności znaku # w opisie współtwórców
polaczone$za_adnotacje <- ifelse(grepl("\\#",polaczone$za_opis_wspoltworcow),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności \"#\" współtwórcy z pola 700).",paste(polaczone$za_adnotacje,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności # współtwórcy z pola 700).",sep = "# ")),as.character(polaczone$za_adnotacje))
#korekta automatycznego IOK
automatyczny_IOK <- polaczone %>%
  mutate(czy_tyt_oryg = (!grepl("polsk",DZ_NAZWA)&!is.na(za_tytul_oryginalu))|grepl("polsk",DZ_NAZWA)) %>%
  filter(za_adnotacje==""&am_nazwisko!="NA"&!grepl("pseud|nazw",za_opis_fizyczny_ksiazki)&!grepl("\\|",am_nazwisko)&czy_tyt_oryg==TRUE,
         !grepl("szkic|felieton|list",str_replace(za_tytul,"(.*)(\\[.*$)","\\2"),ignore.case = TRUE)) %>%
  select(rekord_BN) %>%
  unique() %>%
  filter(rekord_BN %notin% data$ZA_UWAGI[data$czy_automatycznie=="nie"]) %>%
  mutate(powinno_byc = "IOK")
write.csv2(automatyczny_IOK, paste("C:/Users/",employee_name,"/Desktop/imp_",import_year,"_automatyczne_podmiotowe.csv",sep = ""), row.names = F, na = '', fileEncoding = 'UTF-8')

out <- cSplit(polaczone, c("am_autor_id", "am_nazwisko", "am_imie","os_osoba_id","os_nazwisko", "os_imie", "fo_symbol","wy_wydawnictwo_id","wy_miejsce","wy_nazwa"),sep = "|",direction = "long") %>%
  unique()

out$rekord_BN <- ifelse(is.na(out$rekord_BN),'',as.character(out$rekord_BN))
out$rz_nazwa <- ifelse(is.na(out$rz_nazwa),'',as.character(out$rz_nazwa))
out$za_ro_rok <- ifelse(is.na(out$za_ro_rok),'',as.character(out$za_ro_rok))
out$za_type <- ifelse(is.na(out$za_type),'',as.character(out$za_type))
out$rz_rodzaj_id <- ifelse(is.na(out$rz_rodzaj_id),'',as.character(out$rz_rodzaj_id))
out$DZ_NAZWA <- ifelse(is.na(out$DZ_NAZWA),'',as.character(out$DZ_NAZWA))
out$DZ_DZIAL_ID <- ifelse(is.na(out$DZ_DZIAL_ID),'',as.character(out$DZ_DZIAL_ID))
out$tw_tworca_id <- ifelse(is.na(out$tw_tworca_id),'',as.character(out$tw_tworca_id))
out$am_autor_id <- ifelse(is.na(out$am_autor_id),'',as.character(out$am_autor_id))
out$am_nazwisko <- ifelse(is.na(out$am_nazwisko),'',as.character(out$am_nazwisko))
out$am_imie <- ifelse(is.na(out$am_imie),'',as.character(out$am_imie))
out$za_tytul <- ifelse(is.na(out$za_tytul),'',as.character(out$za_tytul))
out$za_tytul_oryginalu <- ifelse(is.na(out$za_tytul_oryginalu),'',as.character(out$za_tytul_oryginalu))
out$za_jezyk_oryginalu <- ifelse(is.na(out$za_jezyk_oryginalu),'',as.character(out$za_jezyk_oryginalu))
out$os_osoba_id <- ifelse(is.na(out$os_osoba_id),'',as.character(out$os_osoba_id))
out$os_nazwisko <- ifelse(is.na(out$os_nazwisko),'',as.character(out$os_nazwisko))
out$os_imie <- ifelse(is.na(out$os_imie),'',as.character(out$os_imie))
out$fo_symbol <- ifelse(is.na(out$fo_symbol),'',as.character(out$fo_symbol))
out$za_opis_wspoltworcow <- ifelse(is.na(out$za_opis_wspoltworcow),'',as.character(out$za_opis_wspoltworcow))
out$za_wydanie <- ifelse(is.na(out$za_wydanie),'',as.character(out$za_wydanie))
out$za_tomy <- ifelse(is.na(out$za_tomy),'',as.character(out$za_tomy))
out$za_instytucja <- ifelse(is.na(out$za_instytucja),'',as.character(out$za_instytucja))
out$wy_wydawnictwo_id <- ifelse(is.na(out$wy_wydawnictwo_id),'',as.character(out$wy_wydawnictwo_id))
out$wy_miejsce <- ifelse(is.na(out$wy_miejsce),'',as.character(out$wy_miejsce))
out$wy_nazwa <- ifelse(is.na(out$wy_nazwa),'',as.character(out$wy_nazwa))
out$za_rok_wydania <- ifelse(is.na(out$za_rok_wydania),'',as.character(out$za_rok_wydania))
out$za_opis_fizyczny_ksiazki <- ifelse(is.na(out$za_opis_fizyczny_ksiazki),'',as.character(out$za_opis_fizyczny_ksiazki))
out$za_seria_wydawnicza <- ifelse(is.na(out$za_seria_wydawnicza),'',as.character(out$za_seria_wydawnicza))
out$tw_nazwisko <- ifelse(is.na(out$tw_nazwisko),'',as.character(out$tw_nazwisko))
out$tw_imie <- ifelse(is.na(out$tw_imie),'',as.character(out$tw_imie))
out$pracownik <- ifelse(is.na(out$pracownik),'',as.character(out$pracownik))
out$za_adnotacje <- ifelse(is.na(out$za_adnotacje),'',as.character(out$za_adnotacje))
out$BN_URL <- ifelse(is.na(out$BN_URL),'',as.character(out$BN_URL))

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same
out$same[1] <- 0
out$dzielone <- paste(out$am_autor_id,out$am_nazwisko,out$am_imie,out$os_osoba_id,out$os_nazwisko,out$os_imie,out$fo_symbol,out$wy_wydawnictwo_id,out$wy_miejsce,out$wy_nazwa,sep = "")

out <- out %>%
  filter(!(same==1&dzielone=="")) %>%
  select(1:33)

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same

#ucięcie zbyt długich ciągów znaków, by weszły do oracle'a
dlugosci <- data.frame(pole = c("am_nazwisko", "am_imie", "za_tytul", "za_tytul_oryginalu", "za_jezyk_oryginalu", "os_nazwisko", "os_imie", "za_opis_wspoltworcow", "za_instytucja", "wy_miejsce", "wy_nazwa", "za_opis_fizyczny_ksiazki", "za_seria_wydawnicza", "tw_nazwisko", "tw_imie", "za_adnotacje"), liczba_znakow = c(50,40,500,500,100,50,40,500,255,40,255,1000,255,200,40,2000))
x <- match(dlugosci$pole,names(out))
for (i in x) {
  progress(match(i,x), max.value = length(x))
  dlugosc <- dlugosci$liczba_znakow[match(names(out[i]),dlugosci$pole)]
  out$za_adnotacje <- ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje!="",paste(out$za_adnotacje,paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),sep = "# "),
                             ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje=="",paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),as.character(out$za_adnotacje)))
  
  out[,i] <- ifelse(dlugosc<nchar(as.character(out[,i])),as.character(substr(out[,i],1,dlugosc)),as.character(out[,i]))
}
Progress:  1 on 16  Progress:  2 on 16  Progress:  3 on 16  Progress:  4 on 16  Progress:  5 on 16  Progress:  6 on 16  Progress:  7 on 16  Progress:  8 on 16  Progress:  9 on 16  Progress: 10 on 16  Progress: 11 on 16  Progress: 12 on 16  Progress: 13 on 16  Progress: 14 on 16  Progress: 15 on 16  Progress: 16 on 16  
out$rekord_BN[out$same == 1] <- ""
out$rz_nazwa[out$same == 1] <- ""
out$za_ro_rok[out$same == 1] <- ""
out$za_type[out$same == 1] <- ""
out$rz_rodzaj_id[out$same == 1] <- ""
out$DZ_NAZWA[out$same == 1] <- ""
out$DZ_DZIAL_ID[out$same == 1] <- ""
out$tw_tworca_id[out$same == 1] <- ""
out$za_tytul[out$same == 1] <- ""
out$za_tytul_oryginalu[out$same == 1] <- ""
out$za_jezyk_oryginalu[out$same == 1] <- ""
out$za_opis_wspoltworcow[out$same == 1] <- ""
out$za_wydanie[out$same == 1] <- ""
out$za_tomy[out$same == 1] <- ""
out$za_instytucja[out$same == 1] <- ""
out$za_rok_wydania[out$same == 1] <- ""
out$za_opis_fizyczny_ksiazki[out$same == 1] <- ""
out$za_seria_wydawnicza[out$same == 1] <- ""
out$tw_nazwisko[out$same == 1] <- ""
out$tw_imie[out$same == 1] <- ""
out$pracownik[out$same == 1] <- ""
out$za_adnotacje[out$same == 1] <- ""
out$BN_URL[out$same == 1] <- ""

#przypisanie do automatycznego OK redaktora "automat"
out <- out %>%
  mutate(pracownik = ifelse(rekord_BN %in% automatyczny_IOK$rekord_BN,"AUTOMAT",as.character(pracownik))) %>%
  select(1:33)

#pętla zapisująca po ok. 2000 wierszy z uwzględnieniem kompletności rekordów bibliograficznych rozpisanych na kilka wierszy
out <- out %>%
  mutate(podzial = ifelse(rekord_BN!="",as.character(rekord_BN),NA)) %>%
  fill(podzial)
ile <- unique(out$podzial)
ile <- split(unique(ile), ceiling(seq_along(unique(ile))/1500))
x <- 1:length(ile)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  final <- out %>%
    filter(podzial %in% ile[[i]]) %>%
    select(-podzial)
  write.xlsx(final, paste("C:/Users/",employee_name,"/Desktop/",import_year,"_podmiotowa_do_importu",i,".xlsx",sep = ""),sheetName = "gotowe")
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
bn_ok <- chunk11
data <- bn_ok %>%
  filter(rodzaj_ksiazki=="przedmiotowa") %>%
  mutate(redaktor_dzialu = paste(redaktor_dzialu,"_przedm",sep = ""))
#uwolnienie kolumn z danymi z bn i przetworzenie do PBL
#1: za_uwagi, rz_nazwa, za_ro_rok, za_type, rz_rodzaj_id, tw_tworca_id, tw_nazwisko, tw_imie, dz_dzial_id, dz_nazwa, redaktor_dzialu
pola_pbl <- data %>%
  select(ZA_UWAGI, RZ_NAZWA, ZA_RO_ROK = rok, RZ_RODZAJ_ID, TW_TWORCA_ID, TW_NAZWISKO, TW_IMIE, DZ_DZIAL_ID, DZ_NAZWA, redaktor_dzialu) %>%
  mutate(ZA_TYPE = "KS")
#2: autor
BN_autor <- data %>%
  select(X100,X245,ZA_UWAGI)
#pole 100
marc_field_100 <- BN_autor %>%
  select(ZA_UWAGI,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(BN_autor$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
#pole 245
marc_field_245 <- BN_autor %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(BN_autor$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
BN_autor <- marc_field_100 %>%
  select(ZA_UWAGI,`$a`,`$b`) %>%
  unique() %>%
  mutate(`$a` = ifelse(!is.na(`$b`),paste(`$a`,`$b`,sep = " "),as.character(`$a`))) %>%
  mutate(`$a` = str_remove(`$a`,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)")) %>%
  unique() %>%
  mutate(AM_NAZWISKO = ifelse(grepl("\\|",`$a`), str_replace_all(str_remove_all(`$a`,","),"\\|",", "),
                              ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\1"),as.character(`$a`))),
         AM_IMIE = ifelse(grepl("\\|",`$a`),"*",
                          ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\3"),"*"))) %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE) %>%
  left_join(.,marc_field_245,by="ZA_UWAGI") %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE, X245c = `$c`)
  
x <- 1:lengths(BN_autor[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  BN_autor$czy_nazwisko[i] <- grepl(BN_autor$AM_NAZWISKO[i],BN_autor$X245c[i])
  BN_autor$czy_imie[i] <- grepl(BN_autor$AM_IMIE[i],BN_autor$X245c[i])
}
Progress:    1 on 1469  Progress:    2 on 1469  Progress:    3 on 1469  Progress:    4 on 1469  Progress:    5 on 1469  Progress:    6 on 1469  Progress:    7 on 1469  Progress:    8 on 1469  Progress:    9 on 1469  Progress:   10 on 1469  Progress:   11 on 1469  Progress:   12 on 1469  Progress:   13 on 1469  Progress:   14 on 1469  Progress:   15 on 1469  Progress:   16 on 1469  Progress:   17 on 1469  Progress:   18 on 1469  Progress:   19 on 1469  Progress:   20 on 1469  Progress:   21 on 1469  Progress:   22 on 1469  Progress:   23 on 1469  Progress:   24 on 1469  Progress:   25 on 1469  Progress:   26 on 1469  Progress:   27 on 1469  Progress:   28 on 1469  Progress:   29 on 1469  Progress:   30 on 1469  Progress:   31 on 1469  Progress:   32 on 1469  Progress:   33 on 1469  Progress:   34 on 1469  Progress:   35 on 1469  Progress:   36 on 1469  Progress:   37 on 1469  Progress:   38 on 1469  Progress:   39 on 1469  Progress:   40 on 1469  Progress:   41 on 1469  Progress:   42 on 1469  Progress:   43 on 1469  Progress:   44 on 1469  Progress:   45 on 1469  Progress:   46 on 1469  Progress:   47 on 1469  Progress:   48 on 1469  Progress:   49 on 1469  Progress:   50 on 1469  Progress:   51 on 1469  Progress:   52 on 1469  Progress:   53 on 1469  Progress:   54 on 1469  Progress:   55 on 1469  Progress:   56 on 1469  Progress:   57 on 1469  Progress:   58 on 1469  Progress:   59 on 1469  Progress:   60 on 1469  Progress:   61 on 1469  Progress:   62 on 1469  Progress:   63 on 1469  Progress:   64 on 1469  Progress:   65 on 1469  Progress:   66 on 1469  Progress:   67 on 1469  Progress:   68 on 1469  Progress:   69 on 1469  Progress:   70 on 1469  Progress:   71 on 1469  Progress:   72 on 1469  Progress:   73 on 1469  Progress:   74 on 1469  Progress:   75 on 1469  Progress:   76 on 1469  Progress:   77 on 1469  Progress:   78 on 1469  Progress:   79 on 1469  Progress:   80 on 1469  Progress:   81 on 1469  Progress:   82 on 1469  Progress:   83 on 1469  Progress:   84 on 1469  Progress:   85 on 1469  Progress:   86 on 1469  Progress:   87 on 1469  Progress:   88 on 1469  Progress:   89 on 1469  Progress:   90 on 1469  Progress:   91 on 1469  Progress:   92 on 1469  Progress:   93 on 1469  Progress:   94 on 1469  Progress:   95 on 1469  Progress:   96 on 1469  Progress:   97 on 1469  Progress:   98 on 1469  Progress:   99 on 1469  Progress:  100 on 1469  Progress:  101 on 1469  Progress:  102 on 1469  Progress:  103 on 1469  Progress:  104 on 1469  Progress:  105 on 1469  Progress:  106 on 1469  Progress:  107 on 1469  Progress:  108 on 1469  Progress:  109 on 1469  Progress:  110 on 1469  Progress:  111 on 1469  Progress:  112 on 1469  Progress:  113 on 1469  Progress:  114 on 1469  Progress:  115 on 1469  Progress:  116 on 1469  Progress:  117 on 1469  Progress:  118 on 1469  Progress:  119 on 1469  Progress:  120 on 1469  Progress:  121 on 1469  Progress:  122 on 1469  Progress:  123 on 1469  Progress:  124 on 1469  Progress:  125 on 1469  Progress:  126 on 1469  Progress:  127 on 1469  Progress:  128 on 1469  Progress:  129 on 1469  Progress:  130 on 1469  Progress:  131 on 1469  Progress:  132 on 1469  Progress:  133 on 1469  Progress:  134 on 1469  Progress:  135 on 1469  Progress:  136 on 1469  Progress:  137 on 1469  Progress:  138 on 1469  Progress:  139 on 1469  Progress:  140 on 1469  Progress:  141 on 1469  Progress:  142 on 1469  Progress:  143 on 1469  Progress:  144 on 1469  Progress:  145 on 1469  Progress:  146 on 1469  Progress:  147 on 1469  Progress:  148 on 1469  Progress:  149 on 1469  Progress:  150 on 1469  Progress:  151 on 1469  Progress:  152 on 1469  Progress:  153 on 1469  Progress:  154 on 1469  Progress:  155 on 1469  Progress:  156 on 1469  Progress:  157 on 1469  Progress:  158 on 1469  Progress:  159 on 1469  Progress:  160 on 1469  Progress:  161 on 1469  Progress:  162 on 1469  Progress:  163 on 1469  Progress:  164 on 1469  Progress:  165 on 1469  Progress:  166 on 1469  Progress:  167 on 1469  Progress:  168 on 1469  Progress:  169 on 1469  Progress:  170 on 1469  Progress:  171 on 1469  Progress:  172 on 1469  Progress:  173 on 1469  Progress:  174 on 1469  Progress:  175 on 1469  Progress:  176 on 1469  Progress:  177 on 1469  Progress:  178 on 1469  Progress:  179 on 1469  Progress:  180 on 1469  Progress:  181 on 1469  Progress:  182 on 1469  Progress:  183 on 1469  Progress:  184 on 1469  Progress:  185 on 1469  Progress:  186 on 1469  Progress:  187 on 1469  Progress:  188 on 1469  Progress:  189 on 1469  Progress:  190 on 1469  Progress:  191 on 1469  Progress:  192 on 1469  Progress:  193 on 1469  Progress:  194 on 1469  Progress:  195 on 1469  Progress:  196 on 1469  Progress:  197 on 1469  Progress:  198 on 1469  Progress:  199 on 1469  Progress:  200 on 1469  Progress:  201 on 1469  Progress:  202 on 1469  Progress:  203 on 1469  Progress:  204 on 1469  Progress:  205 on 1469  Progress:  206 on 1469  Progress:  207 on 1469  Progress:  208 on 1469  Progress:  209 on 1469  Progress:  210 on 1469  Progress:  211 on 1469  Progress:  212 on 1469  Progress:  213 on 1469  Progress:  214 on 1469  Progress:  215 on 1469  Progress:  216 on 1469  Progress:  217 on 1469  Progress:  218 on 1469  Progress:  219 on 1469  Progress:  220 on 1469  Progress:  221 on 1469  Progress:  222 on 1469  Progress:  223 on 1469  Progress:  224 on 1469  Progress:  225 on 1469  Progress:  226 on 1469  Progress:  227 on 1469  Progress:  228 on 1469  Progress:  229 on 1469  Progress:  230 on 1469  Progress:  231 on 1469  Progress:  232 on 1469  Progress:  233 on 1469  Progress:  234 on 1469  Progress:  235 on 1469  Progress:  236 on 1469  Progress:  237 on 1469  Progress:  238 on 1469  Progress:  239 on 1469  Progress:  240 on 1469  Progress:  241 on 1469  Progress:  242 on 1469  Progress:  243 on 1469  Progress:  244 on 1469  Progress:  245 on 1469  Progress:  246 on 1469  Progress:  247 on 1469  Progress:  248 on 1469  Progress:  249 on 1469  Progress:  250 on 1469  Progress:  251 on 1469  Progress:  252 on 1469  Progress:  253 on 1469  Progress:  254 on 1469  Progress:  255 on 1469  Progress:  256 on 1469  Progress:  257 on 1469  Progress:  258 on 1469  Progress:  259 on 1469  Progress:  260 on 1469  Progress:  261 on 1469  Progress:  262 on 1469  Progress:  263 on 1469  Progress:  264 on 1469  Progress:  265 on 1469  Progress:  266 on 1469  Progress:  267 on 1469  Progress:  268 on 1469  Progress:  269 on 1469  Progress:  270 on 1469  Progress:  271 on 1469  Progress:  272 on 1469  Progress:  273 on 1469  Progress:  274 on 1469  Progress:  275 on 1469  Progress:  276 on 1469  Progress:  277 on 1469  Progress:  278 on 1469  Progress:  279 on 1469  Progress:  280 on 1469  Progress:  281 on 1469  Progress:  282 on 1469  Progress:  283 on 1469  Progress:  284 on 1469  Progress:  285 on 1469  Progress:  286 on 1469  Progress:  287 on 1469  Progress:  288 on 1469  Progress:  289 on 1469  Progress:  290 on 1469  Progress:  291 on 1469  Progress:  292 on 1469  Progress:  293 on 1469  Progress:  294 on 1469  Progress:  295 on 1469  Progress:  296 on 1469  Progress:  297 on 1469  Progress:  298 on 1469  Progress:  299 on 1469  Progress:  300 on 1469  Progress:  301 on 1469  Progress:  302 on 1469  Progress:  303 on 1469  Progress:  304 on 1469  Progress:  305 on 1469  Progress:  306 on 1469  Progress:  307 on 1469  Progress:  308 on 1469  Progress:  309 on 1469  Progress:  310 on 1469  Progress:  311 on 1469  Progress:  312 on 1469  Progress:  313 on 1469  Progress:  314 on 1469  Progress:  315 on 1469  Progress:  316 on 1469  Progress:  317 on 1469  Progress:  318 on 1469  Progress:  319 on 1469  Progress:  320 on 1469  Progress:  321 on 1469  Progress:  322 on 1469  Progress:  323 on 1469  Progress:  324 on 1469  Progress:  325 on 1469  Progress:  326 on 1469  Progress:  327 on 1469  Progress:  328 on 1469  Progress:  329 on 1469  Progress:  330 on 1469  Progress:  331 on 1469  Progress:  332 on 1469  Progress:  333 on 1469  Progress:  334 on 1469  Progress:  335 on 1469  Progress:  336 on 1469  Progress:  337 on 1469  Progress:  338 on 1469  Progress:  339 on 1469  Progress:  340 on 1469  Progress:  341 on 1469  Progress:  342 on 1469  Progress:  343 on 1469  Progress:  344 on 1469  Progress:  345 on 1469  Progress:  346 on 1469  Progress:  347 on 1469  Progress:  348 on 1469  Progress:  349 on 1469  Progress:  350 on 1469  Progress:  351 on 1469  Progress:  352 on 1469  Progress:  353 on 1469  Progress:  354 on 1469  Progress:  355 on 1469  Progress:  356 on 1469  Progress:  357 on 1469  Progress:  358 on 1469  Progress:  359 on 1469  Progress:  360 on 1469  Progress:  361 on 1469  Progress:  362 on 1469  Progress:  363 on 1469  Progress:  364 on 1469  Progress:  365 on 1469  Progress:  366 on 1469  Progress:  367 on 1469  Progress:  368 on 1469  Progress:  369 on 1469  Progress:  370 on 1469  Progress:  371 on 1469  Progress:  372 on 1469  Progress:  373 on 1469  Progress:  374 on 1469  Progress:  375 on 1469  Progress:  376 on 1469  Progress:  377 on 1469  Progress:  378 on 1469  Progress:  379 on 1469  Progress:  380 on 1469  Progress:  381 on 1469  Progress:  382 on 1469  Progress:  383 on 1469  Progress:  384 on 1469  Progress:  385 on 1469  Progress:  386 on 1469  Progress:  387 on 1469  Progress:  388 on 1469  Progress:  389 on 1469  Progress:  390 on 1469  Progress:  391 on 1469  Progress:  392 on 1469  Progress:  393 on 1469  Progress:  394 on 1469  Progress:  395 on 1469  Progress:  396 on 1469  Progress:  397 on 1469  Progress:  398 on 1469  Progress:  399 on 1469  Progress:  400 on 1469  Progress:  401 on 1469  Progress:  402 on 1469  Progress:  403 on 1469  Progress:  404 on 1469  Progress:  405 on 1469  Progress:  406 on 1469  Progress:  407 on 1469  Progress:  408 on 1469  Progress:  409 on 1469  Progress:  410 on 1469  Progress:  411 on 1469  Progress:  412 on 1469  Progress:  413 on 1469  Progress:  414 on 1469  Progress:  415 on 1469  Progress:  416 on 1469  Progress:  417 on 1469  Progress:  418 on 1469  Progress:  419 on 1469  Progress:  420 on 1469  Progress:  421 on 1469  Progress:  422 on 1469  Progress:  423 on 1469  Progress:  424 on 1469  Progress:  425 on 1469  Progress:  426 on 1469  Progress:  427 on 1469  Progress:  428 on 1469  Progress:  429 on 1469  Progress:  430 on 1469  Progress:  431 on 1469  Progress:  432 on 1469  Progress:  433 on 1469  Progress:  434 on 1469  Progress:  435 on 1469  Progress:  436 on 1469  Progress:  437 on 1469  Progress:  438 on 1469  Progress:  439 on 1469  Progress:  440 on 1469  Progress:  441 on 1469  Progress:  442 on 1469  Progress:  443 on 1469  Progress:  444 on 1469  Progress:  445 on 1469  Progress:  446 on 1469  Progress:  447 on 1469  Progress:  448 on 1469  Progress:  449 on 1469  Progress:  450 on 1469  Progress:  451 on 1469  Progress:  452 on 1469  Progress:  453 on 1469  Progress:  454 on 1469  Progress:  455 on 1469  Progress:  456 on 1469  Progress:  457 on 1469  Progress:  458 on 1469  Progress:  459 on 1469  Progress:  460 on 1469  Progress:  461 on 1469  Progress:  462 on 1469  Progress:  463 on 1469  Progress:  464 on 1469  Progress:  465 on 1469  Progress:  466 on 1469  Progress:  467 on 1469  Progress:  468 on 1469  Progress:  469 on 1469  Progress:  470 on 1469  Progress:  471 on 1469  Progress:  472 on 1469  Progress:  473 on 1469  Progress:  474 on 1469  Progress:  475 on 1469  Progress:  476 on 1469  Progress:  477 on 1469  Progress:  478 on 1469  Progress:  479 on 1469  Progress:  480 on 1469  Progress:  481 on 1469  Progress:  482 on 1469  Progress:  483 on 1469  Progress:  484 on 1469  Progress:  485 on 1469  Progress:  486 on 1469  Progress:  487 on 1469  Progress:  488 on 1469  Progress:  489 on 1469  Progress:  490 on 1469  Progress:  491 on 1469  Progress:  492 on 1469  Progress:  493 on 1469  Progress:  494 on 1469  Progress:  495 on 1469  Progress:  496 on 1469  Progress:  497 on 1469  Progress:  498 on 1469  Progress:  499 on 1469  Progress:  500 on 1469  Progress:  501 on 1469  Progress:  502 on 1469  Progress:  503 on 1469  Progress:  504 on 1469  Progress:  505 on 1469  Progress:  506 on 1469  Progress:  507 on 1469  Progress:  508 on 1469  Progress:  509 on 1469  Progress:  510 on 1469  Progress:  511 on 1469  Progress:  512 on 1469  Progress:  513 on 1469  Progress:  514 on 1469  Progress:  515 on 1469  Progress:  516 on 1469  Progress:  517 on 1469  Progress:  518 on 1469  Progress:  519 on 1469  Progress:  520 on 1469  Progress:  521 on 1469  Progress:  522 on 1469  Progress:  523 on 1469  Progress:  524 on 1469  Progress:  525 on 1469  Progress:  526 on 1469  Progress:  527 on 1469  Progress:  528 on 1469  Progress:  529 on 1469  Progress:  530 on 1469  Progress:  531 on 1469  Progress:  532 on 1469  Progress:  533 on 1469  Progress:  534 on 1469  Progress:  535 on 1469  Progress:  536 on 1469  Progress:  537 on 1469  Progress:  538 on 1469  Progress:  539 on 1469  Progress:  540 on 1469  Progress:  541 on 1469  Progress:  542 on 1469  Progress:  543 on 1469  Progress:  544 on 1469  Progress:  545 on 1469  Progress:  546 on 1469  Progress:  547 on 1469  Progress:  548 on 1469  Progress:  549 on 1469  Progress:  550 on 1469  Progress:  551 on 1469  Progress:  552 on 1469  Progress:  553 on 1469  Progress:  554 on 1469  Progress:  555 on 1469  Progress:  556 on 1469  Progress:  557 on 1469  Progress:  558 on 1469  Progress:  559 on 1469  Progress:  560 on 1469  Progress:  561 on 1469  Progress:  562 on 1469  Progress:  563 on 1469  Progress:  564 on 1469  Progress:  565 on 1469  Progress:  566 on 1469  Progress:  567 on 1469  Progress:  568 on 1469  Progress:  569 on 1469  Progress:  570 on 1469  Progress:  571 on 1469  Progress:  572 on 1469  Progress:  573 on 1469  Progress:  574 on 1469  Progress:  575 on 1469  Progress:  576 on 1469  Progress:  577 on 1469  Progress:  578 on 1469  Progress:  579 on 1469  Progress:  580 on 1469  Progress:  581 on 1469  Progress:  582 on 1469  Progress:  583 on 1469  Progress:  584 on 1469  Progress:  585 on 1469  Progress:  586 on 1469  Progress:  587 on 1469  Progress:  588 on 1469  Progress:  589 on 1469  Progress:  590 on 1469  Progress:  591 on 1469  Progress:  592 on 1469  Progress:  593 on 1469  Progress:  594 on 1469  Progress:  595 on 1469  Progress:  596 on 1469  Progress:  597 on 1469  Progress:  598 on 1469  Progress:  599 on 1469  Progress:  600 on 1469  Progress:  601 on 1469  Progress:  602 on 1469  Progress:  603 on 1469  Progress:  604 on 1469  Progress:  605 on 1469  Progress:  606 on 1469  Progress:  607 on 1469  Progress:  608 on 1469  Progress:  609 on 1469  Progress:  610 on 1469  Progress:  611 on 1469  Progress:  612 on 1469  Progress:  613 on 1469  Progress:  614 on 1469  Progress:  615 on 1469  Progress:  616 on 1469  Progress:  617 on 1469  Progress:  618 on 1469  Progress:  619 on 1469  Progress:  620 on 1469  Progress:  621 on 1469  Progress:  622 on 1469  Progress:  623 on 1469  Progress:  624 on 1469  Progress:  625 on 1469  Progress:  626 on 1469  Progress:  627 on 1469  Progress:  628 on 1469  Progress:  629 on 1469  Progress:  630 on 1469  Progress:  631 on 1469  Progress:  632 on 1469  Progress:  633 on 1469  Progress:  634 on 1469  Progress:  635 on 1469  Progress:  636 on 1469  Progress:  637 on 1469  Progress:  638 on 1469  Progress:  639 on 1469  Progress:  640 on 1469  Progress:  641 on 1469  Progress:  642 on 1469  Progress:  643 on 1469  Progress:  644 on 1469  Progress:  645 on 1469  Progress:  646 on 1469  Progress:  647 on 1469  Progress:  648 on 1469  Progress:  649 on 1469  Progress:  650 on 1469  Progress:  651 on 1469  Progress:  652 on 1469  Progress:  653 on 1469  Progress:  654 on 1469  Progress:  655 on 1469  Progress:  656 on 1469  Progress:  657 on 1469  Progress:  658 on 1469  Progress:  659 on 1469  Progress:  660 on 1469  Progress:  661 on 1469  Progress:  662 on 1469  Progress:  663 on 1469  Progress:  664 on 1469  Progress:  665 on 1469  Progress:  666 on 1469  Progress:  667 on 1469  Progress:  668 on 1469  Progress:  669 on 1469  Progress:  670 on 1469  Progress:  671 on 1469  Progress:  672 on 1469  Progress:  673 on 1469  Progress:  674 on 1469  Progress:  675 on 1469  Progress:  676 on 1469  Progress:  677 on 1469  Progress:  678 on 1469  Progress:  679 on 1469  Progress:  680 on 1469  Progress:  681 on 1469  Progress:  682 on 1469  Progress:  683 on 1469  Progress:  684 on 1469  Progress:  685 on 1469  Progress:  686 on 1469  Progress:  687 on 1469  Progress:  688 on 1469  Progress:  689 on 1469  Progress:  690 on 1469  Progress:  691 on 1469  Progress:  692 on 1469  Progress:  693 on 1469  Progress:  694 on 1469  Progress:  695 on 1469  Progress:  696 on 1469  Progress:  697 on 1469  Progress:  698 on 1469  Progress:  699 on 1469  Progress:  700 on 1469  Progress:  701 on 1469  Progress:  702 on 1469  Progress:  703 on 1469  Progress:  704 on 1469  Progress:  705 on 1469  Progress:  706 on 1469  Progress:  707 on 1469  Progress:  708 on 1469  Progress:  709 on 1469  Progress:  710 on 1469  Progress:  711 on 1469  Progress:  712 on 1469  Progress:  713 on 1469  Progress:  714 on 1469  Progress:  715 on 1469  Progress:  716 on 1469  Progress:  717 on 1469  Progress:  718 on 1469  Progress:  719 on 1469  Progress:  720 on 1469  Progress:  721 on 1469  Progress:  722 on 1469  Progress:  723 on 1469  Progress:  724 on 1469  Progress:  725 on 1469  Progress:  726 on 1469  Progress:  727 on 1469  Progress:  728 on 1469  Progress:  729 on 1469  Progress:  730 on 1469  Progress:  731 on 1469  Progress:  732 on 1469  Progress:  733 on 1469  Progress:  734 on 1469  Progress:  735 on 1469  Progress:  736 on 1469  Progress:  737 on 1469  Progress:  738 on 1469  Progress:  739 on 1469  Progress:  740 on 1469  Progress:  741 on 1469  Progress:  742 on 1469  Progress:  743 on 1469  Progress:  744 on 1469  Progress:  745 on 1469  Progress:  746 on 1469  Progress:  747 on 1469  Progress:  748 on 1469  Progress:  749 on 1469  Progress:  750 on 1469  Progress:  751 on 1469  Progress:  752 on 1469  Progress:  753 on 1469  Progress:  754 on 1469  Progress:  755 on 1469  Progress:  756 on 1469  Progress:  757 on 1469  Progress:  758 on 1469  Progress:  759 on 1469  Progress:  760 on 1469  Progress:  761 on 1469  Progress:  762 on 1469  Progress:  763 on 1469  Progress:  764 on 1469  Progress:  765 on 1469  Progress:  766 on 1469  Progress:  767 on 1469  Progress:  768 on 1469  Progress:  769 on 1469  Progress:  770 on 1469  Progress:  771 on 1469  Progress:  772 on 1469  Progress:  773 on 1469  Progress:  774 on 1469  Progress:  775 on 1469  Progress:  776 on 1469  Progress:  777 on 1469  Progress:  778 on 1469  Progress:  779 on 1469  Progress:  780 on 1469  Progress:  781 on 1469  Progress:  782 on 1469  Progress:  783 on 1469  Progress:  784 on 1469  Progress:  785 on 1469  Progress:  786 on 1469  Progress:  787 on 1469  Progress:  788 on 1469  Progress:  789 on 1469  Progress:  790 on 1469  Progress:  791 on 1469  Progress:  792 on 1469  Progress:  793 on 1469  Progress:  794 on 1469  Progress:  795 on 1469  Progress:  796 on 1469  Progress:  797 on 1469  Progress:  798 on 1469  Progress:  799 on 1469  Progress:  800 on 1469  Progress:  801 on 1469  Progress:  802 on 1469  Progress:  803 on 1469  Progress:  804 on 1469  Progress:  805 on 1469  Progress:  806 on 1469  Progress:  807 on 1469  Progress:  808 on 1469  Progress:  809 on 1469  Progress:  810 on 1469  Progress:  811 on 1469  Progress:  812 on 1469  Progress:  813 on 1469  Progress:  814 on 1469  Progress:  815 on 1469  Progress:  816 on 1469  Progress:  817 on 1469  Progress:  818 on 1469  Progress:  819 on 1469  Progress:  820 on 1469  Progress:  821 on 1469  Progress:  822 on 1469  Progress:  823 on 1469  Progress:  824 on 1469  Progress:  825 on 1469  Progress:  826 on 1469  Progress:  827 on 1469  Progress:  828 on 1469  Progress:  829 on 1469  Progress:  830 on 1469  Progress:  831 on 1469  Progress:  832 on 1469  Progress:  833 on 1469  Progress:  834 on 1469  Progress:  835 on 1469  Progress:  836 on 1469  Progress:  837 on 1469  Progress:  838 on 1469  Progress:  839 on 1469  Progress:  840 on 1469  Progress:  841 on 1469  Progress:  842 on 1469  Progress:  843 on 1469  Progress:  844 on 1469  Progress:  845 on 1469  Progress:  846 on 1469  Progress:  847 on 1469  Progress:  848 on 1469  Progress:  849 on 1469  Progress:  850 on 1469  Progress:  851 on 1469  Progress:  852 on 1469  Progress:  853 on 1469  Progress:  854 on 1469  Progress:  855 on 1469  Progress:  856 on 1469  Progress:  857 on 1469  Progress:  858 on 1469  Progress:  859 on 1469  Progress:  860 on 1469  Progress:  861 on 1469  Progress:  862 on 1469  Progress:  863 on 1469  Progress:  864 on 1469  Progress:  865 on 1469  Progress:  866 on 1469  Progress:  867 on 1469  Progress:  868 on 1469  Progress:  869 on 1469  Progress:  870 on 1469  Progress:  871 on 1469  Progress:  872 on 1469  Progress:  873 on 1469  Progress:  874 on 1469  Progress:  875 on 1469  Progress:  876 on 1469  Progress:  877 on 1469  Progress:  878 on 1469  Progress:  879 on 1469  Progress:  880 on 1469  Progress:  881 on 1469  Progress:  882 on 1469  Progress:  883 on 1469  Progress:  884 on 1469  Progress:  885 on 1469  Progress:  886 on 1469  Progress:  887 on 1469  Progress:  888 on 1469  Progress:  889 on 1469  Progress:  890 on 1469  Progress:  891 on 1469  Progress:  892 on 1469  Progress:  893 on 1469  Progress:  894 on 1469  Progress:  895 on 1469  Progress:  896 on 1469  Progress:  897 on 1469  Progress:  898 on 1469  Progress:  899 on 1469  Progress:  900 on 1469  Progress:  901 on 1469  Progress:  902 on 1469  Progress:  903 on 1469  Progress:  904 on 1469  Progress:  905 on 1469  Progress:  906 on 1469  Progress:  907 on 1469  Progress:  908 on 1469  Progress:  909 on 1469  Progress:  910 on 1469  Progress:  911 on 1469  Progress:  912 on 1469  Progress:  913 on 1469  Progress:  914 on 1469  Progress:  915 on 1469  Progress:  916 on 1469  Progress:  917 on 1469  Progress:  918 on 1469  Progress:  919 on 1469  Progress:  920 on 1469  Progress:  921 on 1469  Progress:  922 on 1469  Progress:  923 on 1469  Progress:  924 on 1469  Progress:  925 on 1469  Progress:  926 on 1469  Progress:  927 on 1469  Progress:  928 on 1469  Progress:  929 on 1469  Progress:  930 on 1469  Progress:  931 on 1469  Progress:  932 on 1469  Progress:  933 on 1469  Progress:  934 on 1469  Progress:  935 on 1469  Progress:  936 on 1469  Progress:  937 on 1469  Progress:  938 on 1469  Progress:  939 on 1469  Progress:  940 on 1469  Progress:  941 on 1469  Progress:  942 on 1469  Progress:  943 on 1469  Progress:  944 on 1469  Progress:  945 on 1469  Progress:  946 on 1469  Progress:  947 on 1469  Progress:  948 on 1469  Progress:  949 on 1469  Progress:  950 on 1469  Progress:  951 on 1469  Progress:  952 on 1469  Progress:  953 on 1469  Progress:  954 on 1469  Progress:  955 on 1469  Progress:  956 on 1469  Progress:  957 on 1469  Progress:  958 on 1469  Progress:  959 on 1469  Progress:  960 on 1469  Progress:  961 on 1469  Progress:  962 on 1469  Progress:  963 on 1469  Progress:  964 on 1469  Progress:  965 on 1469  Progress:  966 on 1469  Progress:  967 on 1469  Progress:  968 on 1469  Progress:  969 on 1469  Progress:  970 on 1469  Progress:  971 on 1469  Progress:  972 on 1469  Progress:  973 on 1469  Progress:  974 on 1469  Progress:  975 on 1469  Progress:  976 on 1469  Progress:  977 on 1469  Progress:  978 on 1469  Progress:  979 on 1469  Progress:  980 on 1469  Progress:  981 on 1469  Progress:  982 on 1469  Progress:  983 on 1469  Progress:  984 on 1469  Progress:  985 on 1469  Progress:  986 on 1469  Progress:  987 on 1469  Progress:  988 on 1469  Progress:  989 on 1469  Progress:  990 on 1469  Progress:  991 on 1469  Progress:  992 on 1469  Progress:  993 on 1469  Progress:  994 on 1469  Progress:  995 on 1469  Progress:  996 on 1469  Progress:  997 on 1469  Progress:  998 on 1469  Progress:  999 on 1469  Progress: 1000 on 1469  Progress: 1001 on 1469  Progress: 1002 on 1469  Progress: 1003 on 1469  Progress: 1004 on 1469  Progress: 1005 on 1469  Progress: 1006 on 1469  Progress: 1007 on 1469  Progress: 1008 on 1469  Progress: 1009 on 1469  Progress: 1010 on 1469  Progress: 1011 on 1469  Progress: 1012 on 1469  Progress: 1013 on 1469  Progress: 1014 on 1469  Progress: 1015 on 1469  Progress: 1016 on 1469  Progress: 1017 on 1469  Progress: 1018 on 1469  Progress: 1019 on 1469  Progress: 1020 on 1469  Progress: 1021 on 1469  Progress: 1022 on 1469  Progress: 1023 on 1469  Progress: 1024 on 1469  Progress: 1025 on 1469  Progress: 1026 on 1469  Progress: 1027 on 1469  Progress: 1028 on 1469  Progress: 1029 on 1469  Progress: 1030 on 1469  Progress: 1031 on 1469  Progress: 1032 on 1469  Progress: 1033 on 1469  Progress: 1034 on 1469  Progress: 1035 on 1469  Progress: 1036 on 1469  Progress: 1037 on 1469  Progress: 1038 on 1469  Progress: 1039 on 1469  Progress: 1040 on 1469  Progress: 1041 on 1469  Progress: 1042 on 1469  Progress: 1043 on 1469  Progress: 1044 on 1469  Progress: 1045 on 1469  Progress: 1046 on 1469  Progress: 1047 on 1469  Progress: 1048 on 1469  Progress: 1049 on 1469  Progress: 1050 on 1469  Progress: 1051 on 1469  Progress: 1052 on 1469  Progress: 1053 on 1469  Progress: 1054 on 1469  Progress: 1055 on 1469  Progress: 1056 on 1469  Progress: 1057 on 1469  Progress: 1058 on 1469  Progress: 1059 on 1469  Progress: 1060 on 1469  Progress: 1061 on 1469  Progress: 1062 on 1469  Progress: 1063 on 1469  Progress: 1064 on 1469  Progress: 1065 on 1469  Progress: 1066 on 1469  Progress: 1067 on 1469  Progress: 1068 on 1469  Progress: 1069 on 1469  Progress: 1070 on 1469  Progress: 1071 on 1469  Progress: 1072 on 1469  Progress: 1073 on 1469  Progress: 1074 on 1469  Progress: 1075 on 1469  Progress: 1076 on 1469  Progress: 1077 on 1469  Progress: 1078 on 1469  Progress: 1079 on 1469  Progress: 1080 on 1469  Progress: 1081 on 1469  Progress: 1082 on 1469  Progress: 1083 on 1469  Progress: 1084 on 1469  Progress: 1085 on 1469  Progress: 1086 on 1469  Progress: 1087 on 1469  Progress: 1088 on 1469  Progress: 1089 on 1469  Progress: 1090 on 1469  Progress: 1091 on 1469  Progress: 1092 on 1469  Progress: 1093 on 1469  Progress: 1094 on 1469  Progress: 1095 on 1469  Progress: 1096 on 1469  Progress: 1097 on 1469  Progress: 1098 on 1469  Progress: 1099 on 1469  Progress: 1100 on 1469  Progress: 1101 on 1469  Progress: 1102 on 1469  Progress: 1103 on 1469  Progress: 1104 on 1469  Progress: 1105 on 1469  Progress: 1106 on 1469  Progress: 1107 on 1469  Progress: 1108 on 1469  Progress: 1109 on 1469  Progress: 1110 on 1469  Progress: 1111 on 1469  Progress: 1112 on 1469  Progress: 1113 on 1469  Progress: 1114 on 1469  Progress: 1115 on 1469  Progress: 1116 on 1469  Progress: 1117 on 1469  Progress: 1118 on 1469  Progress: 1119 on 1469  Progress: 1120 on 1469  Progress: 1121 on 1469  Progress: 1122 on 1469  Progress: 1123 on 1469  Progress: 1124 on 1469  Progress: 1125 on 1469  Progress: 1126 on 1469  Progress: 1127 on 1469  Progress: 1128 on 1469  Progress: 1129 on 1469  Progress: 1130 on 1469  Progress: 1131 on 1469  Progress: 1132 on 1469  Progress: 1133 on 1469  Progress: 1134 on 1469  Progress: 1135 on 1469  Progress: 1136 on 1469  Progress: 1137 on 1469  Progress: 1138 on 1469  Progress: 1139 on 1469  Progress: 1140 on 1469  Progress: 1141 on 1469  Progress: 1142 on 1469  Progress: 1143 on 1469  Progress: 1144 on 1469  Progress: 1145 on 1469  Progress: 1146 on 1469  Progress: 1147 on 1469  Progress: 1148 on 1469  Progress: 1149 on 1469  Progress: 1150 on 1469  Progress: 1151 on 1469  Progress: 1152 on 1469  Progress: 1153 on 1469  Progress: 1154 on 1469  Progress: 1155 on 1469  Progress: 1156 on 1469  Progress: 1157 on 1469  Progress: 1158 on 1469  Progress: 1159 on 1469  Progress: 1160 on 1469  Progress: 1161 on 1469  Progress: 1162 on 1469  Progress: 1163 on 1469  Progress: 1164 on 1469  Progress: 1165 on 1469  Progress: 1166 on 1469  Progress: 1167 on 1469  Progress: 1168 on 1469  Progress: 1169 on 1469  Progress: 1170 on 1469  Progress: 1171 on 1469  Progress: 1172 on 1469  Progress: 1173 on 1469  Progress: 1174 on 1469  Progress: 1175 on 1469  Progress: 1176 on 1469  Progress: 1177 on 1469  Progress: 1178 on 1469  Progress: 1179 on 1469  Progress: 1180 on 1469  Progress: 1181 on 1469  Progress: 1182 on 1469  Progress: 1183 on 1469  Progress: 1184 on 1469  Progress: 1185 on 1469  Progress: 1186 on 1469  Progress: 1187 on 1469  Progress: 1188 on 1469  Progress: 1189 on 1469  Progress: 1190 on 1469  Progress: 1191 on 1469  Progress: 1192 on 1469  Progress: 1193 on 1469  Progress: 1194 on 1469  Progress: 1195 on 1469  Progress: 1196 on 1469  Progress: 1197 on 1469  Progress: 1198 on 1469  Progress: 1199 on 1469  Progress: 1200 on 1469  Progress: 1201 on 1469  Progress: 1202 on 1469  Progress: 1203 on 1469  Progress: 1204 on 1469  Progress: 1205 on 1469  Progress: 1206 on 1469  Progress: 1207 on 1469  Progress: 1208 on 1469  Progress: 1209 on 1469  Progress: 1210 on 1469  Progress: 1211 on 1469  Progress: 1212 on 1469  Progress: 1213 on 1469  Progress: 1214 on 1469  Progress: 1215 on 1469  Progress: 1216 on 1469  Progress: 1217 on 1469  Progress: 1218 on 1469  Progress: 1219 on 1469  Progress: 1220 on 1469  Progress: 1221 on 1469  Progress: 1222 on 1469  Progress: 1223 on 1469  Progress: 1224 on 1469  Progress: 1225 on 1469  Progress: 1226 on 1469  Progress: 1227 on 1469  Progress: 1228 on 1469  Progress: 1229 on 1469  Progress: 1230 on 1469  Progress: 1231 on 1469  Progress: 1232 on 1469  Progress: 1233 on 1469  Progress: 1234 on 1469  Progress: 1235 on 1469  Progress: 1236 on 1469  Progress: 1237 on 1469  Progress: 1238 on 1469  Progress: 1239 on 1469  Progress: 1240 on 1469  Progress: 1241 on 1469  Progress: 1242 on 1469  Progress: 1243 on 1469  Progress: 1244 on 1469  Progress: 1245 on 1469  Progress: 1246 on 1469  Progress: 1247 on 1469  Progress: 1248 on 1469  Progress: 1249 on 1469  Progress: 1250 on 1469  Progress: 1251 on 1469  Progress: 1252 on 1469  Progress: 1253 on 1469  Progress: 1254 on 1469  Progress: 1255 on 1469  Progress: 1256 on 1469  Progress: 1257 on 1469  Progress: 1258 on 1469  Progress: 1259 on 1469  Progress: 1260 on 1469  Progress: 1261 on 1469  Progress: 1262 on 1469  Progress: 1263 on 1469  Progress: 1264 on 1469  Progress: 1265 on 1469  Progress: 1266 on 1469  Progress: 1267 on 1469  Progress: 1268 on 1469  Progress: 1269 on 1469  Progress: 1270 on 1469  Progress: 1271 on 1469  Progress: 1272 on 1469  Progress: 1273 on 1469  Progress: 1274 on 1469  Progress: 1275 on 1469  Progress: 1276 on 1469  Progress: 1277 on 1469  Progress: 1278 on 1469  Progress: 1279 on 1469  Progress: 1280 on 1469  Progress: 1281 on 1469  Progress: 1282 on 1469  Progress: 1283 on 1469  Progress: 1284 on 1469  Progress: 1285 on 1469  Progress: 1286 on 1469  Progress: 1287 on 1469  Progress: 1288 on 1469  Progress: 1289 on 1469  Progress: 1290 on 1469  Progress: 1291 on 1469  Progress: 1292 on 1469  Progress: 1293 on 1469  Progress: 1294 on 1469  Progress: 1295 on 1469  Progress: 1296 on 1469  Progress: 1297 on 1469  Progress: 1298 on 1469  Progress: 1299 on 1469  Progress: 1300 on 1469  Progress: 1301 on 1469  Progress: 1302 on 1469  Progress: 1303 on 1469  Progress: 1304 on 1469  Progress: 1305 on 1469  Progress: 1306 on 1469  Progress: 1307 on 1469  Progress: 1308 on 1469  Progress: 1309 on 1469  Progress: 1310 on 1469  Progress: 1311 on 1469  Progress: 1312 on 1469  Progress: 1313 on 1469  Progress: 1314 on 1469  Progress: 1315 on 1469  Progress: 1316 on 1469  Progress: 1317 on 1469  Progress: 1318 on 1469  Progress: 1319 on 1469  Progress: 1320 on 1469  Progress: 1321 on 1469  Progress: 1322 on 1469  Progress: 1323 on 1469  Progress: 1324 on 1469  Progress: 1325 on 1469  Progress: 1326 on 1469  Progress: 1327 on 1469  Progress: 1328 on 1469  Progress: 1329 on 1469  Progress: 1330 on 1469  Progress: 1331 on 1469  Progress: 1332 on 1469  Progress: 1333 on 1469  Progress: 1334 on 1469  Progress: 1335 on 1469  Progress: 1336 on 1469  Progress: 1337 on 1469  Progress: 1338 on 1469  Progress: 1339 on 1469  Progress: 1340 on 1469  Progress: 1341 on 1469  Progress: 1342 on 1469  Progress: 1343 on 1469  Progress: 1344 on 1469  Progress: 1345 on 1469  Progress: 1346 on 1469  Progress: 1347 on 1469  Progress: 1348 on 1469  Progress: 1349 on 1469  Progress: 1350 on 1469  Progress: 1351 on 1469  Progress: 1352 on 1469  Progress: 1353 on 1469  Progress: 1354 on 1469  Progress: 1355 on 1469  Progress: 1356 on 1469  Progress: 1357 on 1469  Progress: 1358 on 1469  Progress: 1359 on 1469  Progress: 1360 on 1469  Progress: 1361 on 1469  Progress: 1362 on 1469  Progress: 1363 on 1469  Progress: 1364 on 1469  Progress: 1365 on 1469  Progress: 1366 on 1469  Progress: 1367 on 1469  Progress: 1368 on 1469  Progress: 1369 on 1469  Progress: 1370 on 1469  Progress: 1371 on 1469  Progress: 1372 on 1469  Progress: 1373 on 1469  Progress: 1374 on 1469  Progress: 1375 on 1469  Progress: 1376 on 1469  Progress: 1377 on 1469  Progress: 1378 on 1469  Progress: 1379 on 1469  Progress: 1380 on 1469  Progress: 1381 on 1469  Progress: 1382 on 1469  Progress: 1383 on 1469  Progress: 1384 on 1469  Progress: 1385 on 1469  Progress: 1386 on 1469  Progress: 1387 on 1469  Progress: 1388 on 1469  Progress: 1389 on 1469  Progress: 1390 on 1469  Progress: 1391 on 1469  Progress: 1392 on 1469  Progress: 1393 on 1469  Progress: 1394 on 1469  Progress: 1395 on 1469  Progress: 1396 on 1469  Progress: 1397 on 1469  Progress: 1398 on 1469  Progress: 1399 on 1469  Progress: 1400 on 1469  Progress: 1401 on 1469  Progress: 1402 on 1469  Progress: 1403 on 1469  Progress: 1404 on 1469  Progress: 1405 on 1469  Progress: 1406 on 1469  Progress: 1407 on 1469  Progress: 1408 on 1469  Progress: 1409 on 1469  Progress: 1410 on 1469  Progress: 1411 on 1469  Progress: 1412 on 1469  Progress: 1413 on 1469  Progress: 1414 on 1469  Progress: 1415 on 1469  Progress: 1416 on 1469  Progress: 1417 on 1469  Progress: 1418 on 1469  Progress: 1419 on 1469  Progress: 1420 on 1469  Progress: 1421 on 1469  Progress: 1422 on 1469  Progress: 1423 on 1469  Progress: 1424 on 1469  Progress: 1425 on 1469  Progress: 1426 on 1469  Progress: 1427 on 1469  Progress: 1428 on 1469  Progress: 1429 on 1469  Progress: 1430 on 1469  Progress: 1431 on 1469  Progress: 1432 on 1469  Progress: 1433 on 1469  Progress: 1434 on 1469  Progress: 1435 on 1469  Progress: 1436 on 1469  Progress: 1437 on 1469  Progress: 1438 on 1469  Progress: 1439 on 1469  Progress: 1440 on 1469  Progress: 1441 on 1469  Progress: 1442 on 1469  Progress: 1443 on 1469  Progress: 1444 on 1469  Progress: 1445 on 1469  Progress: 1446 on 1469  Progress: 1447 on 1469  Progress: 1448 on 1469  Progress: 1449 on 1469  Progress: 1450 on 1469  Progress: 1451 on 1469  Progress: 1452 on 1469  Progress: 1453 on 1469  Progress: 1454 on 1469  Progress: 1455 on 1469  Progress: 1456 on 1469  Progress: 1457 on 1469  Progress: 1458 on 1469  Progress: 1459 on 1469  Progress: 1460 on 1469  Progress: 1461 on 1469  Progress: 1462 on 1469  Progress: 1463 on 1469  Progress: 1464 on 1469  Progress: 1465 on 1469  Progress: 1466 on 1469  Progress: 1467 on 1469  Progress: 1468 on 1469  Progress: 1469 on 1469  
BN_autor <- BN_autor %>%
  mutate(ZA_ADNOTACJE = ifelse(czy_nazwisko==FALSE|czy_imie==FALSE,paste("UWAGA! Konflikt w danych osobowych w polach 100 i 245. Porównaj pole autor w formularzu z polem BN: ",X245c,sep = ""),NA)) %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,ZA_ADNOTACJE) %>%
  mutate(nazwa = str_replace_all(str_to_lower(paste(AM_NAZWISKO,AM_IMIE, sep = "")), "\\W", "")) %>%
  left_join(.,PBL_autorzy %>% select(AM_AUTOR_ID,AM_KRYPTONIM,AM_LICZBA_ZAPISOW,nazwa) %>% filter(is.na(AM_KRYPTONIM)),by="nazwa") %>%
  arrange(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,-AM_LICZBA_ZAPISOW)
BN_autor$id_grupy <- cumsum(!duplicated(BN_autor[1:3]))
BN_autor <- BN_autor[!duplicated(BN_autor$id_grupy),] %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,ZA_ADNOTACJE,AM_AUTOR_ID)

#3: tytuł
#pole 245
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
za_tytul <- marc_field_245 %>%
  select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = " "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = " "),
         `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = " "),
         `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  unite("ZA_TYTUL",`$a`:`$p`,sep = " ",na.rm = TRUE) %>%
  mutate(ZA_TYTUL = str_replace_all(ZA_TYTUL," +"," "),
         ZA_TYTUL = str_remove(ZA_TYTUL, "\\s+\\/\\s{0,}$"),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = str_replace_all(ZA_TYTUL,"\\.{3} \\.{3}","... "),
         ZA_TYTUL = str_replace_all(ZA_TYTUL," ; ",". "),
         ZA_TYTUL = gsub("( : )(.)",". \\U\\2",perl=TRUE,ZA_TYTUL)) %>%
  select(ZA_UWAGI,ZA_TYTUL)

#4: tytuł oryginału
#pole 246
marc_field_246 <- data %>%
  select(ZA_UWAGI,X246)%>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"~"),
         X246=str_replace_all(X246,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X246",sep = "~",direction = "long") %>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"^\\|")) %>%
  mutate(indicator = str_replace_all(X246,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X246,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_246)[1]))
colnames(empty_table) <-subfield_list
marc_field_246<-cbind(marc_field_246,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_246$X246 <- str_replace(marc_field_246$X246,subfield_list_char[i],"|\\1")
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_246[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_246$X246),str_replace_all(gsub(string,"\\3",marc_field_246$X246),"\\${2}.", "~"),NA)
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
if("$n" %in% colnames(marc_field_246)) {
marc_field_246 <- marc_field_246[, colSums(is.na(marc_field_246)) != nrow(marc_field_246)] %>%
  filter(grepl("oryg",X246)) %>%
  select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = ", "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = ""),
         `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = ""),
         `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = "")) %>%
  ungroup() %>%
  unique() %>%
  unite("X246",`$a`:`$p`,sep = " ",na.rm = TRUE) %>% 
  mutate(X246 = str_replace_all(X246," +"," "),
         X246 = str_remove(X246, "\\s+\\/\\s{0,}$"),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X246),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( ){0,1}(.)",X246),gsub("(\\W)( )(:|;)( ){0,1}(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = str_replace_all(X246,"\\.{3} \\.{3}","... "),
         X246 = gsub("( : )(.)",". \\U\\2",perl=TRUE,X246)) %>%
  select(ZA_UWAGI, X246)
} else {
  marc_field_246 <- marc_field_246[, colSums(is.na(marc_field_246)) != nrow(marc_field_246)] %>%
  filter(grepl("oryg",X246)) %>%
  select(ZA_UWAGI,`$a`,`$b`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = ", "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = "")) %>%
  ungroup() %>%
  unique() %>%
  unite("X246",`$a`:`$b`,sep = " ",na.rm = TRUE) %>% 
  mutate(X246 = str_replace_all(X246," +"," "),
         X246 = str_remove(X246, "\\s+\\/\\s{0,}$"),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X246),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( ){0,1}(.)",X246),gsub("(\\W)( )(:|;)( ){0,1}(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = str_replace_all(X246,"\\.{3} \\.{3}","... "),
         X246 = gsub("( : )(.)",". \\U\\2",perl=TRUE,X246)) %>%
  select(ZA_UWAGI, X246)
}

#pole 500
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"~"),
         X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
marc_field_500 <- marc_field_500 %>%
  filter(grepl("oryg\\.\\:",X500)) %>%
  mutate(X500 = str_remove(`$a`,"^Tyt\\. oryg\\.: |^Tyt\\, oryg\\.: |^.*?tyt\\. oryg\\.: "),
         X500 = str_remove(X500, "\\s+\\/\\s{0,}$"),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = str_replace_all(X500,"\\.{3} \\.{3}","... "),
         X500 = str_remove(X500, "\\.$"),
         X500 = str_remove(X500,"(,{0,1} {0,1})\\d{4}.*$|(, t|. T)yt. oryg. cyklu:")) %>%
  select(ZA_UWAGI,X500)
#tytuł oryginału
za_tytul_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_246,by="ZA_UWAGI") %>%
  left_join(.,marc_field_500,by="ZA_UWAGI") %>%
  mutate(X500 = ifelse(is.na(X500),NA,
                       ifelse(grepl("oryg",X500),NA,as.character(X500))),
         X500 = ifelse(!is.na(X500)&grepl("\\. - ",X500),str_replace(X500,"(.*?)(\\. - .*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Na książce pseud",X500),str_replace(X500,"(.*?)(\\. Na książce pseud.*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Przekł\\. wg",X500),str_replace(X500,"(.*?)(\\. Przekł\\. wg.*$)","\\1"),as.character(X500)),
         ZA_TYTUL_ORYGINALU = ifelse(is.na(X246)&is.na(X500),NA,
                                     ifelse(!is.na(X500),as.character(X500),as.character(X246))),
         ZA_TYTUL_ORYGINALU = str_remove_all(ZA_TYTUL_ORYGINALU,'\\"')) %>%
  select(ZA_UWAGI,ZA_TYTUL_ORYGINALU)
#5: język oryginału
marc_field_041 <- data %>%
  select(ZA_UWAGI,X041)%>%
  filter(X041!="") %>%
  mutate(X041=str_replace_all(X041,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X041",sep = "~",direction = "long") %>%
  filter(X041!="") %>%
  mutate(X041=str_remove_all(X041,"^\\|")) %>%
  mutate(indicator = str_replace_all(X041,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X041,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_041)[1]))
colnames(empty_table) <-subfield_list
marc_field_041<-cbind(marc_field_041,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_041$X041 <- str_replace(marc_field_041$X041,subfield_list_char[i],"|\\1")
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_041[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_041$X041),str_replace_all(gsub(string,"\\3",marc_field_041$X041),"\\${2}.", "~"),NA)
}
Progress: 1 on 6  Progress: 2 on 6  Progress: 3 on 6  Progress: 4 on 6  Progress: 5 on 6  Progress: 6 on 6  
za_jezyk_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_041 %>% select(ZA_UWAGI,ZA_JEZYK_ORYGINALU = `$a`),by="ZA_UWAGI") %>%
  mutate(ZA_JEZYK_ORYGINALU = str_replace_all(ZA_JEZYK_ORYGINALU,"\\$a",",")) %>%
  unique()

#6: współtwórcy
marc_field_700 <- data %>%
  select(ZA_UWAGI,X700)%>%
  filter(X700!="") %>%
  mutate(X700=str_replace_all(X700,"(..\\$a)","|\\1"),
         X700=str_replace_all(X700,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X700",sep = "~",direction = "long") %>%
  filter(X700!="") %>%
  mutate(X700=str_remove_all(X700,"^\\|")) %>%
  mutate(indicator = str_replace_all(X700,"(^.*?)(\\$.*)","\\1")) %>%
  filter(X700!="")
subfield_list<- str_extract_all(data$X700,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_700)[1]))
colnames(empty_table) <-subfield_list
marc_field_700<-cbind(marc_field_700,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_700$X700 <- str_replace(marc_field_700$X700,subfield_list_char[i],"|\\1")
}
Progress: 1 on 9  Progress: 2 on 9  Progress: 3 on 9  Progress: 4 on 9  Progress: 5 on 9  Progress: 6 on 9  Progress: 7 on 9  Progress: 8 on 9  Progress: 9 on 9  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_700[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_700$X700),str_replace_all(gsub(string,"\\3",marc_field_700$X700),"\\${2}.", "~"),NA)
}
Progress: 1 on 9  Progress: 2 on 9  Progress: 3 on 9  Progress: 4 on 9  Progress: 5 on 9  Progress: 6 on 9  Progress: 7 on 9  Progress: 8 on 9  Progress: 9 on 9  
BN_wspoltworca <- marc_field_700 %>%
  select(ZA_UWAGI,osoba = `$a`,funkcja = `$e`) %>%
  filter(!is.na(funkcja)) %>%
  mutate(osoba = str_remove(osoba,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)"),
         OS_NAZWISKO = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\1"),as.character(osoba)),
         OS_IMIE = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\3"),"*"),
         ws_prosty = str_replace_all(str_to_lower(osoba), "\\W", ""),
         fu_prosta = str_replace_all(str_to_lower(funkcja), "\\W", "")) %>%
  left_join(.,PBL_wspoltworcy %>% select(OS_OSOBA_ID,OS_LICZBA_ZAPISOW,nazwa_prosta),by=c("ws_prosty"="nazwa_prosta")) %>%
  arrange(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,-OS_LICZBA_ZAPISOW)
BN_wspoltworca$id_grupy <- cumsum(!duplicated(BN_wspoltworca[1:2]))
BN_wspoltworca <- BN_wspoltworca[!duplicated(BN_wspoltworca$id_grupy),] %>%
  left_join(.,PBL_funkcje,by=c("fu_prosta"="nazwa")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL",NA,as.character(fo_symbol))) %>%
  select(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,OS_OSOBA_ID,fo_symbol,fo_nazwa,funkcja)

#tutaj przeszukać X245 i znaleźć błędy współtwórców
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,X245c=`$c`)

BN_wspoltworca <- BN_wspoltworca %>%
  left_join(.,marc_field_245,by="ZA_UWAGI")

x <- 1:lengths(BN_wspoltworca[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  BN_wspoltworca$czy_nazwisko[i] <- str_detect(BN_wspoltworca$X245c[i],BN_wspoltworca$OS_NAZWISKO[i])
  BN_wspoltworca$czy_imie[i] <- grepl(BN_wspoltworca$OS_IMIE[i],BN_wspoltworca$X245c[i])
}
Progress:    1 on 1545  Progress:    2 on 1545  Progress:    3 on 1545  Progress:    4 on 1545  Progress:    5 on 1545  Progress:    6 on 1545  Progress:    7 on 1545  Progress:    8 on 1545  Progress:    9 on 1545  Progress:   10 on 1545  Progress:   11 on 1545  Progress:   12 on 1545  Progress:   13 on 1545  Progress:   14 on 1545  Progress:   15 on 1545  Progress:   16 on 1545  Progress:   17 on 1545  Progress:   18 on 1545  Progress:   19 on 1545  Progress:   20 on 1545  Progress:   21 on 1545  Progress:   22 on 1545  Progress:   23 on 1545  Progress:   24 on 1545  Progress:   25 on 1545  Progress:   26 on 1545  Progress:   27 on 1545  Progress:   28 on 1545  Progress:   29 on 1545  Progress:   30 on 1545  Progress:   31 on 1545  Progress:   32 on 1545  Progress:   33 on 1545  Progress:   34 on 1545  Progress:   35 on 1545  Progress:   36 on 1545  Progress:   37 on 1545  Progress:   38 on 1545  Progress:   39 on 1545  Progress:   40 on 1545  Progress:   41 on 1545  Progress:   42 on 1545  Progress:   43 on 1545  Progress:   44 on 1545  Progress:   45 on 1545  Progress:   46 on 1545  Progress:   47 on 1545  Progress:   48 on 1545  Progress:   49 on 1545  Progress:   50 on 1545  Progress:   51 on 1545  Progress:   52 on 1545  Progress:   53 on 1545  Progress:   54 on 1545  Progress:   55 on 1545  Progress:   56 on 1545  Progress:   57 on 1545  Progress:   58 on 1545  Progress:   59 on 1545  Progress:   60 on 1545  Progress:   61 on 1545  Progress:   62 on 1545  Progress:   63 on 1545  Progress:   64 on 1545  Progress:   65 on 1545  Progress:   66 on 1545  Progress:   67 on 1545  Progress:   68 on 1545  Progress:   69 on 1545  Progress:   70 on 1545  Progress:   71 on 1545  Progress:   72 on 1545  Progress:   73 on 1545  Progress:   74 on 1545  Progress:   75 on 1545  Progress:   76 on 1545  Progress:   77 on 1545  Progress:   78 on 1545  Progress:   79 on 1545  Progress:   80 on 1545  Progress:   81 on 1545  Progress:   82 on 1545  Progress:   83 on 1545  Progress:   84 on 1545  Progress:   85 on 1545  Progress:   86 on 1545  Progress:   87 on 1545  Progress:   88 on 1545  Progress:   89 on 1545  Progress:   90 on 1545  Progress:   91 on 1545  Progress:   92 on 1545  Progress:   93 on 1545  Progress:   94 on 1545  Progress:   95 on 1545  Progress:   96 on 1545  Progress:   97 on 1545  Progress:   98 on 1545  Progress:   99 on 1545  Progress:  100 on 1545  Progress:  101 on 1545  Progress:  102 on 1545  Progress:  103 on 1545  Progress:  104 on 1545  Progress:  105 on 1545  Progress:  106 on 1545  Progress:  107 on 1545  Progress:  108 on 1545  Progress:  109 on 1545  Progress:  110 on 1545  Progress:  111 on 1545  Progress:  112 on 1545  Progress:  113 on 1545  Progress:  114 on 1545  Progress:  115 on 1545  Progress:  116 on 1545  Progress:  117 on 1545  Progress:  118 on 1545  Progress:  119 on 1545  Progress:  120 on 1545  Progress:  121 on 1545  Progress:  122 on 1545  Progress:  123 on 1545  Progress:  124 on 1545  Progress:  125 on 1545  Progress:  126 on 1545  Progress:  127 on 1545  Progress:  128 on 1545  Progress:  129 on 1545  Progress:  130 on 1545  Progress:  131 on 1545  Progress:  132 on 1545  Progress:  133 on 1545  Progress:  134 on 1545  Progress:  135 on 1545  Progress:  136 on 1545  Progress:  137 on 1545  Progress:  138 on 1545  Progress:  139 on 1545  Progress:  140 on 1545  Progress:  141 on 1545  Progress:  142 on 1545  Progress:  143 on 1545  Progress:  144 on 1545  Progress:  145 on 1545  Progress:  146 on 1545  Progress:  147 on 1545  Progress:  148 on 1545  Progress:  149 on 1545  Progress:  150 on 1545  Progress:  151 on 1545  Progress:  152 on 1545  Progress:  153 on 1545  Progress:  154 on 1545  Progress:  155 on 1545  Progress:  156 on 1545  Progress:  157 on 1545  Progress:  158 on 1545  Progress:  159 on 1545  Progress:  160 on 1545  Progress:  161 on 1545  Progress:  162 on 1545  Progress:  163 on 1545  Progress:  164 on 1545  Progress:  165 on 1545  Progress:  166 on 1545  Progress:  167 on 1545  Progress:  168 on 1545  Progress:  169 on 1545  Progress:  170 on 1545  Progress:  171 on 1545  Progress:  172 on 1545  Progress:  173 on 1545  Progress:  174 on 1545  Progress:  175 on 1545  Progress:  176 on 1545  Progress:  177 on 1545  Progress:  178 on 1545  Progress:  179 on 1545  Progress:  180 on 1545  Progress:  181 on 1545  Progress:  182 on 1545  Progress:  183 on 1545  Progress:  184 on 1545  Progress:  185 on 1545  Progress:  186 on 1545  Progress:  187 on 1545  Progress:  188 on 1545  Progress:  189 on 1545  Progress:  190 on 1545  Progress:  191 on 1545  Progress:  192 on 1545  Progress:  193 on 1545  Progress:  194 on 1545  Progress:  195 on 1545  Progress:  196 on 1545  Progress:  197 on 1545  Progress:  198 on 1545  Progress:  199 on 1545  Progress:  200 on 1545  Progress:  201 on 1545  Progress:  202 on 1545  Progress:  203 on 1545  Progress:  204 on 1545  Progress:  205 on 1545  Progress:  206 on 1545  Progress:  207 on 1545  Progress:  208 on 1545  Progress:  209 on 1545  Progress:  210 on 1545  Progress:  211 on 1545  Progress:  212 on 1545  Progress:  213 on 1545  Progress:  214 on 1545  Progress:  215 on 1545  Progress:  216 on 1545  Progress:  217 on 1545  Progress:  218 on 1545  Progress:  219 on 1545  Progress:  220 on 1545  Progress:  221 on 1545  Progress:  222 on 1545  Progress:  223 on 1545  Progress:  224 on 1545  Progress:  225 on 1545  Progress:  226 on 1545  Progress:  227 on 1545  Progress:  228 on 1545  Progress:  229 on 1545  Progress:  230 on 1545  Progress:  231 on 1545  Progress:  232 on 1545  Progress:  233 on 1545  Progress:  234 on 1545  Progress:  235 on 1545  Progress:  236 on 1545  Progress:  237 on 1545  Progress:  238 on 1545  Progress:  239 on 1545  Progress:  240 on 1545  Progress:  241 on 1545  Progress:  242 on 1545  Progress:  243 on 1545  Progress:  244 on 1545  Progress:  245 on 1545  Progress:  246 on 1545  Progress:  247 on 1545  Progress:  248 on 1545  Progress:  249 on 1545  Progress:  250 on 1545  Progress:  251 on 1545  Progress:  252 on 1545  Progress:  253 on 1545  Progress:  254 on 1545  Progress:  255 on 1545  Progress:  256 on 1545  Progress:  257 on 1545  Progress:  258 on 1545  Progress:  259 on 1545  Progress:  260 on 1545  Progress:  261 on 1545  Progress:  262 on 1545  Progress:  263 on 1545  Progress:  264 on 1545  Progress:  265 on 1545  Progress:  266 on 1545  Progress:  267 on 1545  Progress:  268 on 1545  Progress:  269 on 1545  Progress:  270 on 1545  Progress:  271 on 1545  Progress:  272 on 1545  Progress:  273 on 1545  Progress:  274 on 1545  Progress:  275 on 1545  Progress:  276 on 1545  Progress:  277 on 1545  Progress:  278 on 1545  Progress:  279 on 1545  Progress:  280 on 1545  Progress:  281 on 1545  Progress:  282 on 1545  Progress:  283 on 1545  Progress:  284 on 1545  Progress:  285 on 1545  Progress:  286 on 1545  Progress:  287 on 1545  Progress:  288 on 1545  Progress:  289 on 1545  Progress:  290 on 1545  Progress:  291 on 1545  Progress:  292 on 1545  Progress:  293 on 1545  Progress:  294 on 1545  Progress:  295 on 1545  Progress:  296 on 1545  Progress:  297 on 1545  Progress:  298 on 1545  Progress:  299 on 1545  Progress:  300 on 1545  Progress:  301 on 1545  Progress:  302 on 1545  Progress:  303 on 1545  Progress:  304 on 1545  Progress:  305 on 1545  Progress:  306 on 1545  Progress:  307 on 1545  Progress:  308 on 1545  Progress:  309 on 1545  Progress:  310 on 1545  Progress:  311 on 1545  Progress:  312 on 1545  Progress:  313 on 1545  Progress:  314 on 1545  Progress:  315 on 1545  Progress:  316 on 1545  Progress:  317 on 1545  Progress:  318 on 1545  Progress:  319 on 1545  Progress:  320 on 1545  Progress:  321 on 1545  Progress:  322 on 1545  Progress:  323 on 1545  Progress:  324 on 1545  Progress:  325 on 1545  Progress:  326 on 1545  Progress:  327 on 1545  Progress:  328 on 1545  Progress:  329 on 1545  Progress:  330 on 1545  Progress:  331 on 1545  Progress:  332 on 1545  Progress:  333 on 1545  Progress:  334 on 1545  Progress:  335 on 1545  Progress:  336 on 1545  Progress:  337 on 1545  Progress:  338 on 1545  Progress:  339 on 1545  Progress:  340 on 1545  Progress:  341 on 1545  Progress:  342 on 1545  Progress:  343 on 1545  Progress:  344 on 1545  Progress:  345 on 1545  Progress:  346 on 1545  Progress:  347 on 1545  Progress:  348 on 1545  Progress:  349 on 1545  Progress:  350 on 1545  Progress:  351 on 1545  Progress:  352 on 1545  Progress:  353 on 1545  Progress:  354 on 1545  Progress:  355 on 1545  Progress:  356 on 1545  Progress:  357 on 1545  Progress:  358 on 1545  Progress:  359 on 1545  Progress:  360 on 1545  Progress:  361 on 1545  Progress:  362 on 1545  Progress:  363 on 1545  Progress:  364 on 1545  Progress:  365 on 1545  Progress:  366 on 1545  Progress:  367 on 1545  Progress:  368 on 1545  Progress:  369 on 1545  Progress:  370 on 1545  Progress:  371 on 1545  Progress:  372 on 1545  Progress:  373 on 1545  Progress:  374 on 1545  Progress:  375 on 1545  Progress:  376 on 1545  Progress:  377 on 1545  Progress:  378 on 1545  Progress:  379 on 1545  Progress:  380 on 1545  Progress:  381 on 1545  Progress:  382 on 1545  Progress:  383 on 1545  Progress:  384 on 1545  Progress:  385 on 1545  Progress:  386 on 1545  Progress:  387 on 1545  Progress:  388 on 1545  Progress:  389 on 1545  Progress:  390 on 1545  Progress:  391 on 1545  Progress:  392 on 1545  Progress:  393 on 1545  Progress:  394 on 1545  Progress:  395 on 1545  Progress:  396 on 1545  Progress:  397 on 1545  Progress:  398 on 1545  Progress:  399 on 1545  Progress:  400 on 1545  Progress:  401 on 1545  Progress:  402 on 1545  Progress:  403 on 1545  Progress:  404 on 1545  Progress:  405 on 1545  Progress:  406 on 1545  Progress:  407 on 1545  Progress:  408 on 1545  Progress:  409 on 1545  Progress:  410 on 1545  Progress:  411 on 1545  Progress:  412 on 1545  Progress:  413 on 1545  Progress:  414 on 1545  Progress:  415 on 1545  Progress:  416 on 1545  Progress:  417 on 1545  Progress:  418 on 1545  Progress:  419 on 1545  Progress:  420 on 1545  Progress:  421 on 1545  Progress:  422 on 1545  Progress:  423 on 1545  Progress:  424 on 1545  Progress:  425 on 1545  Progress:  426 on 1545  Progress:  427 on 1545  Progress:  428 on 1545  Progress:  429 on 1545  Progress:  430 on 1545  Progress:  431 on 1545  Progress:  432 on 1545  Progress:  433 on 1545  Progress:  434 on 1545  Progress:  435 on 1545  Progress:  436 on 1545  Progress:  437 on 1545  Progress:  438 on 1545  Progress:  439 on 1545  Progress:  440 on 1545  Progress:  441 on 1545  Progress:  442 on 1545  Progress:  443 on 1545  Progress:  444 on 1545  Progress:  445 on 1545  Progress:  446 on 1545  Progress:  447 on 1545  Progress:  448 on 1545  Progress:  449 on 1545  Progress:  450 on 1545  Progress:  451 on 1545  Progress:  452 on 1545  Progress:  453 on 1545  Progress:  454 on 1545  Progress:  455 on 1545  Progress:  456 on 1545  Progress:  457 on 1545  Progress:  458 on 1545  Progress:  459 on 1545  Progress:  460 on 1545  Progress:  461 on 1545  Progress:  462 on 1545  Progress:  463 on 1545  Progress:  464 on 1545  Progress:  465 on 1545  Progress:  466 on 1545  Progress:  467 on 1545  Progress:  468 on 1545  Progress:  469 on 1545  Progress:  470 on 1545  Progress:  471 on 1545  Progress:  472 on 1545  Progress:  473 on 1545  Progress:  474 on 1545  Progress:  475 on 1545  Progress:  476 on 1545  Progress:  477 on 1545  Progress:  478 on 1545  Progress:  479 on 1545  Progress:  480 on 1545  Progress:  481 on 1545  Progress:  482 on 1545  Progress:  483 on 1545  Progress:  484 on 1545  Progress:  485 on 1545  Progress:  486 on 1545  Progress:  487 on 1545  Progress:  488 on 1545  Progress:  489 on 1545  Progress:  490 on 1545  Progress:  491 on 1545  Progress:  492 on 1545  Progress:  493 on 1545  Progress:  494 on 1545  Progress:  495 on 1545  Progress:  496 on 1545  Progress:  497 on 1545  Progress:  498 on 1545  Progress:  499 on 1545  Progress:  500 on 1545  Progress:  501 on 1545  Progress:  502 on 1545  Progress:  503 on 1545  Progress:  504 on 1545  Progress:  505 on 1545  Progress:  506 on 1545  Progress:  507 on 1545  Progress:  508 on 1545  Progress:  509 on 1545  Progress:  510 on 1545  Progress:  511 on 1545  Progress:  512 on 1545  Progress:  513 on 1545  Progress:  514 on 1545  Progress:  515 on 1545  Progress:  516 on 1545  Progress:  517 on 1545  Progress:  518 on 1545  Progress:  519 on 1545  Progress:  520 on 1545  Progress:  521 on 1545  Progress:  522 on 1545  Progress:  523 on 1545  Progress:  524 on 1545  Progress:  525 on 1545  Progress:  526 on 1545  Progress:  527 on 1545  Progress:  528 on 1545  Progress:  529 on 1545  Progress:  530 on 1545  Progress:  531 on 1545  Progress:  532 on 1545  Progress:  533 on 1545  Progress:  534 on 1545  Progress:  535 on 1545  Progress:  536 on 1545  Progress:  537 on 1545  Progress:  538 on 1545  Progress:  539 on 1545  Progress:  540 on 1545  Progress:  541 on 1545  Progress:  542 on 1545  Progress:  543 on 1545  Progress:  544 on 1545  Progress:  545 on 1545  Progress:  546 on 1545  Progress:  547 on 1545  Progress:  548 on 1545  Progress:  549 on 1545  Progress:  550 on 1545  Progress:  551 on 1545  Progress:  552 on 1545  Progress:  553 on 1545  Progress:  554 on 1545  Progress:  555 on 1545  Progress:  556 on 1545  Progress:  557 on 1545  Progress:  558 on 1545  Progress:  559 on 1545  Progress:  560 on 1545  Progress:  561 on 1545  Progress:  562 on 1545  Progress:  563 on 1545  Progress:  564 on 1545  Progress:  565 on 1545  Progress:  566 on 1545  Progress:  567 on 1545  Progress:  568 on 1545  Progress:  569 on 1545  Progress:  570 on 1545  Progress:  571 on 1545  Progress:  572 on 1545  Progress:  573 on 1545  Progress:  574 on 1545  Progress:  575 on 1545  Progress:  576 on 1545  Progress:  577 on 1545  Progress:  578 on 1545  Progress:  579 on 1545  Progress:  580 on 1545  Progress:  581 on 1545  Progress:  582 on 1545  Progress:  583 on 1545  Progress:  584 on 1545  Progress:  585 on 1545  Progress:  586 on 1545  Progress:  587 on 1545  Progress:  588 on 1545  Progress:  589 on 1545  Progress:  590 on 1545  Progress:  591 on 1545  Progress:  592 on 1545  Progress:  593 on 1545  Progress:  594 on 1545  Progress:  595 on 1545  Progress:  596 on 1545  Progress:  597 on 1545  Progress:  598 on 1545  Progress:  599 on 1545  Progress:  600 on 1545  Progress:  601 on 1545  Progress:  602 on 1545  Progress:  603 on 1545  Progress:  604 on 1545  Progress:  605 on 1545  Progress:  606 on 1545  Progress:  607 on 1545  Progress:  608 on 1545  Progress:  609 on 1545  Progress:  610 on 1545  Progress:  611 on 1545  Progress:  612 on 1545  Progress:  613 on 1545  Progress:  614 on 1545  Progress:  615 on 1545  Progress:  616 on 1545  Progress:  617 on 1545  Progress:  618 on 1545  Progress:  619 on 1545  Progress:  620 on 1545  Progress:  621 on 1545  Progress:  622 on 1545  Progress:  623 on 1545  Progress:  624 on 1545  Progress:  625 on 1545  Progress:  626 on 1545  Progress:  627 on 1545  Progress:  628 on 1545  Progress:  629 on 1545  Progress:  630 on 1545  Progress:  631 on 1545  Progress:  632 on 1545  Progress:  633 on 1545  Progress:  634 on 1545  Progress:  635 on 1545  Progress:  636 on 1545  Progress:  637 on 1545  Progress:  638 on 1545  Progress:  639 on 1545  Progress:  640 on 1545  Progress:  641 on 1545  Progress:  642 on 1545  Progress:  643 on 1545  Progress:  644 on 1545  Progress:  645 on 1545  Progress:  646 on 1545  Progress:  647 on 1545  Progress:  648 on 1545  Progress:  649 on 1545  Progress:  650 on 1545  Progress:  651 on 1545  Progress:  652 on 1545  Progress:  653 on 1545  Progress:  654 on 1545  Progress:  655 on 1545  Progress:  656 on 1545  Progress:  657 on 1545  Progress:  658 on 1545  Progress:  659 on 1545  Progress:  660 on 1545  Progress:  661 on 1545  Progress:  662 on 1545  Progress:  663 on 1545  Progress:  664 on 1545  Progress:  665 on 1545  Progress:  666 on 1545  Progress:  667 on 1545  Progress:  668 on 1545  Progress:  669 on 1545  Progress:  670 on 1545  Progress:  671 on 1545  Progress:  672 on 1545  Progress:  673 on 1545  Progress:  674 on 1545  Progress:  675 on 1545  Progress:  676 on 1545  Progress:  677 on 1545  Progress:  678 on 1545  Progress:  679 on 1545  Progress:  680 on 1545  Progress:  681 on 1545  Progress:  682 on 1545  Progress:  683 on 1545  Progress:  684 on 1545  Progress:  685 on 1545  Progress:  686 on 1545  Progress:  687 on 1545  Progress:  688 on 1545  Progress:  689 on 1545  Progress:  690 on 1545  Progress:  691 on 1545  Progress:  692 on 1545  Progress:  693 on 1545  Progress:  694 on 1545  Progress:  695 on 1545  Progress:  696 on 1545  Progress:  697 on 1545  Progress:  698 on 1545  Progress:  699 on 1545  Progress:  700 on 1545  Progress:  701 on 1545  Progress:  702 on 1545  Progress:  703 on 1545  Progress:  704 on 1545  Progress:  705 on 1545  Progress:  706 on 1545  Progress:  707 on 1545  Progress:  708 on 1545  Progress:  709 on 1545  Progress:  710 on 1545  Progress:  711 on 1545  Progress:  712 on 1545  Progress:  713 on 1545  Progress:  714 on 1545  Progress:  715 on 1545  Progress:  716 on 1545  Progress:  717 on 1545  Progress:  718 on 1545  Progress:  719 on 1545  Progress:  720 on 1545  Progress:  721 on 1545  Progress:  722 on 1545  Progress:  723 on 1545  Progress:  724 on 1545  Progress:  725 on 1545  Progress:  726 on 1545  Progress:  727 on 1545  Progress:  728 on 1545  Progress:  729 on 1545  Progress:  730 on 1545  Progress:  731 on 1545  Progress:  732 on 1545  Progress:  733 on 1545  Progress:  734 on 1545  Progress:  735 on 1545  Progress:  736 on 1545  Progress:  737 on 1545  Progress:  738 on 1545  Progress:  739 on 1545  Progress:  740 on 1545  Progress:  741 on 1545  Progress:  742 on 1545  Progress:  743 on 1545  Progress:  744 on 1545  Progress:  745 on 1545  Progress:  746 on 1545  Progress:  747 on 1545  Progress:  748 on 1545  Progress:  749 on 1545  Progress:  750 on 1545  Progress:  751 on 1545  Progress:  752 on 1545  Progress:  753 on 1545  Progress:  754 on 1545  Progress:  755 on 1545  Progress:  756 on 1545  Progress:  757 on 1545  Progress:  758 on 1545  Progress:  759 on 1545  Progress:  760 on 1545  Progress:  761 on 1545  Progress:  762 on 1545  Progress:  763 on 1545  Progress:  764 on 1545  Progress:  765 on 1545  Progress:  766 on 1545  Progress:  767 on 1545  Progress:  768 on 1545  Progress:  769 on 1545  Progress:  770 on 1545  Progress:  771 on 1545  Progress:  772 on 1545  Progress:  773 on 1545  Progress:  774 on 1545  Progress:  775 on 1545  Progress:  776 on 1545  Progress:  777 on 1545  Progress:  778 on 1545  Progress:  779 on 1545  Progress:  780 on 1545  Progress:  781 on 1545  Progress:  782 on 1545  Progress:  783 on 1545  Progress:  784 on 1545  Progress:  785 on 1545  Progress:  786 on 1545  Progress:  787 on 1545  Progress:  788 on 1545  Progress:  789 on 1545  Progress:  790 on 1545  Progress:  791 on 1545  Progress:  792 on 1545  Progress:  793 on 1545  Progress:  794 on 1545  Progress:  795 on 1545  Progress:  796 on 1545  Progress:  797 on 1545  Progress:  798 on 1545  Progress:  799 on 1545  Progress:  800 on 1545  Progress:  801 on 1545  Progress:  802 on 1545  Progress:  803 on 1545  Progress:  804 on 1545  Progress:  805 on 1545  Progress:  806 on 1545  Progress:  807 on 1545  Progress:  808 on 1545  Progress:  809 on 1545  Progress:  810 on 1545  Progress:  811 on 1545  Progress:  812 on 1545  Progress:  813 on 1545  Progress:  814 on 1545  Progress:  815 on 1545  Progress:  816 on 1545  Progress:  817 on 1545  Progress:  818 on 1545  Progress:  819 on 1545  Progress:  820 on 1545  Progress:  821 on 1545  Progress:  822 on 1545  Progress:  823 on 1545  Progress:  824 on 1545  Progress:  825 on 1545  Progress:  826 on 1545  Progress:  827 on 1545  Progress:  828 on 1545  Progress:  829 on 1545  Progress:  830 on 1545  Progress:  831 on 1545  Progress:  832 on 1545  Progress:  833 on 1545  Progress:  834 on 1545  Progress:  835 on 1545  Progress:  836 on 1545  Progress:  837 on 1545  Progress:  838 on 1545  Progress:  839 on 1545  Progress:  840 on 1545  Progress:  841 on 1545  Progress:  842 on 1545  Progress:  843 on 1545  Progress:  844 on 1545  Progress:  845 on 1545  Progress:  846 on 1545  Progress:  847 on 1545  Progress:  848 on 1545  Progress:  849 on 1545  Progress:  850 on 1545  Progress:  851 on 1545  Progress:  852 on 1545  Progress:  853 on 1545  Progress:  854 on 1545  Progress:  855 on 1545  Progress:  856 on 1545  Progress:  857 on 1545  Progress:  858 on 1545  Progress:  859 on 1545  Progress:  860 on 1545  Progress:  861 on 1545  Progress:  862 on 1545  Progress:  863 on 1545  Progress:  864 on 1545  Progress:  865 on 1545  Progress:  866 on 1545  Progress:  867 on 1545  Progress:  868 on 1545  Progress:  869 on 1545  Progress:  870 on 1545  Progress:  871 on 1545  Progress:  872 on 1545  Progress:  873 on 1545  Progress:  874 on 1545  Progress:  875 on 1545  Progress:  876 on 1545  Progress:  877 on 1545  Progress:  878 on 1545  Progress:  879 on 1545  Progress:  880 on 1545  Progress:  881 on 1545  Progress:  882 on 1545  Progress:  883 on 1545  Progress:  884 on 1545  Progress:  885 on 1545  Progress:  886 on 1545  Progress:  887 on 1545  Progress:  888 on 1545  Progress:  889 on 1545  Progress:  890 on 1545  Progress:  891 on 1545  Progress:  892 on 1545  Progress:  893 on 1545  Progress:  894 on 1545  Progress:  895 on 1545  Progress:  896 on 1545  Progress:  897 on 1545  Progress:  898 on 1545  Progress:  899 on 1545  Progress:  900 on 1545  Progress:  901 on 1545  Progress:  902 on 1545  Progress:  903 on 1545  Progress:  904 on 1545  Progress:  905 on 1545  Progress:  906 on 1545  Progress:  907 on 1545  Progress:  908 on 1545  Progress:  909 on 1545  Progress:  910 on 1545  Progress:  911 on 1545  Progress:  912 on 1545  Progress:  913 on 1545  Progress:  914 on 1545  Progress:  915 on 1545  Progress:  916 on 1545  Progress:  917 on 1545  Progress:  918 on 1545  Progress:  919 on 1545  Progress:  920 on 1545  Progress:  921 on 1545  Progress:  922 on 1545  Progress:  923 on 1545  Progress:  924 on 1545  Progress:  925 on 1545  Progress:  926 on 1545  Progress:  927 on 1545  Progress:  928 on 1545  Progress:  929 on 1545  Progress:  930 on 1545  Progress:  931 on 1545  Progress:  932 on 1545  Progress:  933 on 1545  Progress:  934 on 1545  Progress:  935 on 1545  Progress:  936 on 1545  Progress:  937 on 1545  Progress:  938 on 1545  Progress:  939 on 1545  Progress:  940 on 1545  Progress:  941 on 1545  Progress:  942 on 1545  Progress:  943 on 1545  Progress:  944 on 1545  Progress:  945 on 1545  Progress:  946 on 1545  Progress:  947 on 1545  Progress:  948 on 1545  Progress:  949 on 1545  Progress:  950 on 1545  Progress:  951 on 1545  Progress:  952 on 1545  Progress:  953 on 1545  Progress:  954 on 1545  Progress:  955 on 1545  Progress:  956 on 1545  Progress:  957 on 1545  Progress:  958 on 1545  Progress:  959 on 1545  Progress:  960 on 1545  Progress:  961 on 1545  Progress:  962 on 1545  Progress:  963 on 1545  Progress:  964 on 1545  Progress:  965 on 1545  Progress:  966 on 1545  Progress:  967 on 1545  Progress:  968 on 1545  Progress:  969 on 1545  Progress:  970 on 1545  Progress:  971 on 1545  Progress:  972 on 1545  Progress:  973 on 1545  Progress:  974 on 1545  Progress:  975 on 1545  Progress:  976 on 1545  Progress:  977 on 1545  Progress:  978 on 1545  Progress:  979 on 1545  Progress:  980 on 1545  Progress:  981 on 1545  Progress:  982 on 1545  Progress:  983 on 1545  Progress:  984 on 1545  Progress:  985 on 1545  Progress:  986 on 1545  Progress:  987 on 1545  Progress:  988 on 1545  Progress:  989 on 1545  Progress:  990 on 1545  Progress:  991 on 1545  Progress:  992 on 1545  Progress:  993 on 1545  Progress:  994 on 1545  Progress:  995 on 1545  Progress:  996 on 1545  Progress:  997 on 1545  Progress:  998 on 1545  Progress:  999 on 1545  Progress: 1000 on 1545  Progress: 1001 on 1545  Progress: 1002 on 1545  Progress: 1003 on 1545  Progress: 1004 on 1545  Progress: 1005 on 1545  Progress: 1006 on 1545  Progress: 1007 on 1545  Progress: 1008 on 1545  Progress: 1009 on 1545  Progress: 1010 on 1545  Progress: 1011 on 1545  Progress: 1012 on 1545  Progress: 1013 on 1545  Progress: 1014 on 1545  Progress: 1015 on 1545  Progress: 1016 on 1545  Progress: 1017 on 1545  Progress: 1018 on 1545  Progress: 1019 on 1545  Progress: 1020 on 1545  Progress: 1021 on 1545  Progress: 1022 on 1545  Progress: 1023 on 1545  Progress: 1024 on 1545  Progress: 1025 on 1545  Progress: 1026 on 1545  Progress: 1027 on 1545  Progress: 1028 on 1545  Progress: 1029 on 1545  Progress: 1030 on 1545  Progress: 1031 on 1545  Progress: 1032 on 1545  Progress: 1033 on 1545  Progress: 1034 on 1545  Progress: 1035 on 1545  Progress: 1036 on 1545  Progress: 1037 on 1545  Progress: 1038 on 1545  Progress: 1039 on 1545  Progress: 1040 on 1545  Progress: 1041 on 1545  Progress: 1042 on 1545  Progress: 1043 on 1545  Progress: 1044 on 1545  Progress: 1045 on 1545  Progress: 1046 on 1545  Progress: 1047 on 1545  Progress: 1048 on 1545  Progress: 1049 on 1545  Progress: 1050 on 1545  Progress: 1051 on 1545  Progress: 1052 on 1545  Progress: 1053 on 1545  Progress: 1054 on 1545  Progress: 1055 on 1545  Progress: 1056 on 1545  Progress: 1057 on 1545  Progress: 1058 on 1545  Progress: 1059 on 1545  Progress: 1060 on 1545  Progress: 1061 on 1545  Progress: 1062 on 1545  Progress: 1063 on 1545  Progress: 1064 on 1545  Progress: 1065 on 1545  Progress: 1066 on 1545  Progress: 1067 on 1545  Progress: 1068 on 1545  Progress: 1069 on 1545  Progress: 1070 on 1545  Progress: 1071 on 1545  Progress: 1072 on 1545  Progress: 1073 on 1545  Progress: 1074 on 1545  Progress: 1075 on 1545  Progress: 1076 on 1545  Progress: 1077 on 1545  Progress: 1078 on 1545  Progress: 1079 on 1545  Progress: 1080 on 1545  Progress: 1081 on 1545  Progress: 1082 on 1545  Progress: 1083 on 1545  Progress: 1084 on 1545  Progress: 1085 on 1545  Progress: 1086 on 1545  Progress: 1087 on 1545  Progress: 1088 on 1545  Progress: 1089 on 1545  Progress: 1090 on 1545  Progress: 1091 on 1545  Progress: 1092 on 1545  Progress: 1093 on 1545  Progress: 1094 on 1545  Progress: 1095 on 1545  Progress: 1096 on 1545  Progress: 1097 on 1545  Progress: 1098 on 1545  Progress: 1099 on 1545  Progress: 1100 on 1545  Progress: 1101 on 1545  Progress: 1102 on 1545  Progress: 1103 on 1545  Progress: 1104 on 1545  Progress: 1105 on 1545  Progress: 1106 on 1545  Progress: 1107 on 1545  Progress: 1108 on 1545  Progress: 1109 on 1545  Progress: 1110 on 1545  Progress: 1111 on 1545  Progress: 1112 on 1545  Progress: 1113 on 1545  Progress: 1114 on 1545  Progress: 1115 on 1545  Progress: 1116 on 1545  Progress: 1117 on 1545  Progress: 1118 on 1545  Progress: 1119 on 1545  Progress: 1120 on 1545  Progress: 1121 on 1545  Progress: 1122 on 1545  Progress: 1123 on 1545  Progress: 1124 on 1545  Progress: 1125 on 1545  Progress: 1126 on 1545  Progress: 1127 on 1545  Progress: 1128 on 1545  Progress: 1129 on 1545  Progress: 1130 on 1545  Progress: 1131 on 1545  Progress: 1132 on 1545  Progress: 1133 on 1545  Progress: 1134 on 1545  Progress: 1135 on 1545  Progress: 1136 on 1545  Progress: 1137 on 1545  Progress: 1138 on 1545  Progress: 1139 on 1545  Progress: 1140 on 1545  Progress: 1141 on 1545  Progress: 1142 on 1545  Progress: 1143 on 1545  Progress: 1144 on 1545  Progress: 1145 on 1545  Progress: 1146 on 1545  Progress: 1147 on 1545  Progress: 1148 on 1545  Progress: 1149 on 1545  Progress: 1150 on 1545  Progress: 1151 on 1545  Progress: 1152 on 1545  Progress: 1153 on 1545  Progress: 1154 on 1545  Progress: 1155 on 1545  Progress: 1156 on 1545  Progress: 1157 on 1545  Progress: 1158 on 1545  Progress: 1159 on 1545  Progress: 1160 on 1545  Progress: 1161 on 1545  Progress: 1162 on 1545  Progress: 1163 on 1545  Progress: 1164 on 1545  Progress: 1165 on 1545  Progress: 1166 on 1545  Progress: 1167 on 1545  Progress: 1168 on 1545  Progress: 1169 on 1545  Progress: 1170 on 1545  Progress: 1171 on 1545  Progress: 1172 on 1545  Progress: 1173 on 1545  Progress: 1174 on 1545  Progress: 1175 on 1545  Progress: 1176 on 1545  Progress: 1177 on 1545  Progress: 1178 on 1545  Progress: 1179 on 1545  Progress: 1180 on 1545  Progress: 1181 on 1545  Progress: 1182 on 1545  Progress: 1183 on 1545  Progress: 1184 on 1545  Progress: 1185 on 1545  Progress: 1186 on 1545  Progress: 1187 on 1545  Progress: 1188 on 1545  Progress: 1189 on 1545  Progress: 1190 on 1545  Progress: 1191 on 1545  Progress: 1192 on 1545  Progress: 1193 on 1545  Progress: 1194 on 1545  Progress: 1195 on 1545  Progress: 1196 on 1545  Progress: 1197 on 1545  Progress: 1198 on 1545  Progress: 1199 on 1545  Progress: 1200 on 1545  Progress: 1201 on 1545  Progress: 1202 on 1545  Progress: 1203 on 1545  Progress: 1204 on 1545  Progress: 1205 on 1545  Progress: 1206 on 1545  Progress: 1207 on 1545  Progress: 1208 on 1545  Progress: 1209 on 1545  Progress: 1210 on 1545  Progress: 1211 on 1545  Progress: 1212 on 1545  Progress: 1213 on 1545  Progress: 1214 on 1545  Progress: 1215 on 1545  Progress: 1216 on 1545  Progress: 1217 on 1545  Progress: 1218 on 1545  Progress: 1219 on 1545  Progress: 1220 on 1545  Progress: 1221 on 1545  Progress: 1222 on 1545  Progress: 1223 on 1545  Progress: 1224 on 1545  Progress: 1225 on 1545  Progress: 1226 on 1545  Progress: 1227 on 1545  Progress: 1228 on 1545  Progress: 1229 on 1545  Progress: 1230 on 1545  Progress: 1231 on 1545  Progress: 1232 on 1545  Progress: 1233 on 1545  Progress: 1234 on 1545  Progress: 1235 on 1545  Progress: 1236 on 1545  Progress: 1237 on 1545  Progress: 1238 on 1545  Progress: 1239 on 1545  Progress: 1240 on 1545  Progress: 1241 on 1545  Progress: 1242 on 1545  Progress: 1243 on 1545  Progress: 1244 on 1545  Progress: 1245 on 1545  Progress: 1246 on 1545  Progress: 1247 on 1545  Progress: 1248 on 1545  Progress: 1249 on 1545  Progress: 1250 on 1545  Progress: 1251 on 1545  Progress: 1252 on 1545  Progress: 1253 on 1545  Progress: 1254 on 1545  Progress: 1255 on 1545  Progress: 1256 on 1545  Progress: 1257 on 1545  Progress: 1258 on 1545  Progress: 1259 on 1545  Progress: 1260 on 1545  Progress: 1261 on 1545  Progress: 1262 on 1545  Progress: 1263 on 1545  Progress: 1264 on 1545  Progress: 1265 on 1545  Progress: 1266 on 1545  Progress: 1267 on 1545  Progress: 1268 on 1545  Progress: 1269 on 1545  Progress: 1270 on 1545  Progress: 1271 on 1545  Progress: 1272 on 1545  Progress: 1273 on 1545  Progress: 1274 on 1545  Progress: 1275 on 1545  Progress: 1276 on 1545  Progress: 1277 on 1545  Progress: 1278 on 1545  Progress: 1279 on 1545  Progress: 1280 on 1545  Progress: 1281 on 1545  Progress: 1282 on 1545  Progress: 1283 on 1545  Progress: 1284 on 1545  Progress: 1285 on 1545  Progress: 1286 on 1545  Progress: 1287 on 1545  Progress: 1288 on 1545  Progress: 1289 on 1545  Progress: 1290 on 1545  Progress: 1291 on 1545  Progress: 1292 on 1545  Progress: 1293 on 1545  Progress: 1294 on 1545  Progress: 1295 on 1545  Progress: 1296 on 1545  Progress: 1297 on 1545  Progress: 1298 on 1545  Progress: 1299 on 1545  Progress: 1300 on 1545  Progress: 1301 on 1545  Progress: 1302 on 1545  Progress: 1303 on 1545  Progress: 1304 on 1545  Progress: 1305 on 1545  Progress: 1306 on 1545  Progress: 1307 on 1545  Progress: 1308 on 1545  Progress: 1309 on 1545  Progress: 1310 on 1545  Progress: 1311 on 1545  Progress: 1312 on 1545  Progress: 1313 on 1545  Progress: 1314 on 1545  Progress: 1315 on 1545  Progress: 1316 on 1545  Progress: 1317 on 1545  Progress: 1318 on 1545  Progress: 1319 on 1545  Progress: 1320 on 1545  Progress: 1321 on 1545  Progress: 1322 on 1545  Progress: 1323 on 1545  Progress: 1324 on 1545  Progress: 1325 on 1545  Progress: 1326 on 1545  Progress: 1327 on 1545  Progress: 1328 on 1545  Progress: 1329 on 1545  Progress: 1330 on 1545  Progress: 1331 on 1545  Progress: 1332 on 1545  Progress: 1333 on 1545  Progress: 1334 on 1545  Progress: 1335 on 1545  Progress: 1336 on 1545  Progress: 1337 on 1545  Progress: 1338 on 1545  Progress: 1339 on 1545  Progress: 1340 on 1545  Progress: 1341 on 1545  Progress: 1342 on 1545  Progress: 1343 on 1545  Progress: 1344 on 1545  Progress: 1345 on 1545  Progress: 1346 on 1545  Progress: 1347 on 1545  Progress: 1348 on 1545  Progress: 1349 on 1545  Progress: 1350 on 1545  Progress: 1351 on 1545  Progress: 1352 on 1545  Progress: 1353 on 1545  Progress: 1354 on 1545  Progress: 1355 on 1545  Progress: 1356 on 1545  Progress: 1357 on 1545  Progress: 1358 on 1545  Progress: 1359 on 1545  Progress: 1360 on 1545  Progress: 1361 on 1545  Progress: 1362 on 1545  Progress: 1363 on 1545  Progress: 1364 on 1545  Progress: 1365 on 1545  Progress: 1366 on 1545  Progress: 1367 on 1545  Progress: 1368 on 1545  Progress: 1369 on 1545  Progress: 1370 on 1545  Progress: 1371 on 1545  Progress: 1372 on 1545  Progress: 1373 on 1545  Progress: 1374 on 1545  Progress: 1375 on 1545  Progress: 1376 on 1545  Progress: 1377 on 1545  Progress: 1378 on 1545  Progress: 1379 on 1545  Progress: 1380 on 1545  Progress: 1381 on 1545  Progress: 1382 on 1545  Progress: 1383 on 1545  Progress: 1384 on 1545  Progress: 1385 on 1545  Progress: 1386 on 1545  Progress: 1387 on 1545  Progress: 1388 on 1545  Progress: 1389 on 1545  Progress: 1390 on 1545  Progress: 1391 on 1545  Progress: 1392 on 1545  Progress: 1393 on 1545  Progress: 1394 on 1545  Progress: 1395 on 1545  Progress: 1396 on 1545  Progress: 1397 on 1545  Progress: 1398 on 1545  Progress: 1399 on 1545  Progress: 1400 on 1545  Progress: 1401 on 1545  Progress: 1402 on 1545  Progress: 1403 on 1545  Progress: 1404 on 1545  Progress: 1405 on 1545  Progress: 1406 on 1545  Progress: 1407 on 1545  Progress: 1408 on 1545  Progress: 1409 on 1545  Progress: 1410 on 1545  Progress: 1411 on 1545  Progress: 1412 on 1545  Progress: 1413 on 1545  Progress: 1414 on 1545  Progress: 1415 on 1545  Progress: 1416 on 1545  Progress: 1417 on 1545  Progress: 1418 on 1545  Progress: 1419 on 1545  Progress: 1420 on 1545  Progress: 1421 on 1545  Progress: 1422 on 1545  Progress: 1423 on 1545  Progress: 1424 on 1545  Progress: 1425 on 1545  Progress: 1426 on 1545  Progress: 1427 on 1545  Progress: 1428 on 1545  Progress: 1429 on 1545  Progress: 1430 on 1545  Progress: 1431 on 1545  Progress: 1432 on 1545  Progress: 1433 on 1545  Progress: 1434 on 1545  Progress: 1435 on 1545  Progress: 1436 on 1545  Progress: 1437 on 1545  Progress: 1438 on 1545  Progress: 1439 on 1545  Progress: 1440 on 1545  Progress: 1441 on 1545  Progress: 1442 on 1545  Progress: 1443 on 1545  Progress: 1444 on 1545  Progress: 1445 on 1545  Progress: 1446 on 1545  Progress: 1447 on 1545  Progress: 1448 on 1545  Progress: 1449 on 1545  Progress: 1450 on 1545  Progress: 1451 on 1545  Progress: 1452 on 1545  Progress: 1453 on 1545  Progress: 1454 on 1545  Progress: 1455 on 1545  Progress: 1456 on 1545  Progress: 1457 on 1545  Progress: 1458 on 1545  Progress: 1459 on 1545  Progress: 1460 on 1545  Progress: 1461 on 1545  Progress: 1462 on 1545  Progress: 1463 on 1545  Progress: 1464 on 1545  Progress: 1465 on 1545  Progress: 1466 on 1545  Progress: 1467 on 1545  Progress: 1468 on 1545  Progress: 1469 on 1545  Progress: 1470 on 1545  Progress: 1471 on 1545  Progress: 1472 on 1545  Progress: 1473 on 1545  Progress: 1474 on 1545  Progress: 1475 on 1545  Progress: 1476 on 1545  Progress: 1477 on 1545  Progress: 1478 on 1545  Progress: 1479 on 1545  Progress: 1480 on 1545  Progress: 1481 on 1545  Progress: 1482 on 1545  Progress: 1483 on 1545  Progress: 1484 on 1545  Progress: 1485 on 1545  Progress: 1486 on 1545  Progress: 1487 on 1545  Progress: 1488 on 1545  Progress: 1489 on 1545  Progress: 1490 on 1545  Progress: 1491 on 1545  Progress: 1492 on 1545  Progress: 1493 on 1545  Progress: 1494 on 1545  Progress: 1495 on 1545  Progress: 1496 on 1545  Progress: 1497 on 1545  Progress: 1498 on 1545  Progress: 1499 on 1545  Progress: 1500 on 1545  Progress: 1501 on 1545  Progress: 1502 on 1545  Progress: 1503 on 1545  Progress: 1504 on 1545  Progress: 1505 on 1545  Progress: 1506 on 1545  Progress: 1507 on 1545  Progress: 1508 on 1545  Progress: 1509 on 1545  Progress: 1510 on 1545  Progress: 1511 on 1545  Progress: 1512 on 1545  Progress: 1513 on 1545  Progress: 1514 on 1545  Progress: 1515 on 1545  Progress: 1516 on 1545  Progress: 1517 on 1545  Progress: 1518 on 1545  Progress: 1519 on 1545  Progress: 1520 on 1545  Progress: 1521 on 1545  Progress: 1522 on 1545  Progress: 1523 on 1545  Progress: 1524 on 1545  Progress: 1525 on 1545  Progress: 1526 on 1545  Progress: 1527 on 1545  Progress: 1528 on 1545  Progress: 1529 on 1545  Progress: 1530 on 1545  Progress: 1531 on 1545  Progress: 1532 on 1545  Progress: 1533 on 1545  Progress: 1534 on 1545  Progress: 1535 on 1545  Progress: 1536 on 1545  Progress: 1537 on 1545  Progress: 1538 on 1545  Progress: 1539 on 1545  Progress: 1540 on 1545  Progress: 1541 on 1545  Progress: 1542 on 1545  Progress: 1543 on 1545  Progress: 1544 on 1545  Progress: 1545 on 1545  
BN_wspoltworca <- BN_wspoltworca %>%
  mutate(ZA_ADNOTACJE = ifelse(czy_nazwisko==FALSE|czy_imie==FALSE,paste("UWAGA! Konflikt w danych osobowych w polach 700 i 245. Porównaj pola współtórców w formularzu z polem BN: ",X245c,sep = ""),NA)) %>%
  select(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,OS_OSOBA_ID,fo_symbol,fo_nazwa,funkcja,ZA_ADNOTACJE)

#7: opis współtwórców
opis_wspoltworcow <- BN_wspoltworca %>%
  select(ZA_UWAGI,funkcja,OS_IMIE,OS_NAZWISKO) %>%
  full_join(.,marc_field_245,by="ZA_UWAGI") %>%
  filter(!is.na(OS_NAZWISKO)|(is.na(OS_NAZWISKO)&grepl("et al\\.",X245c))) %>%
  mutate(jest_et_al = grepl("et al\\.",X245c),
         OS_IMIE = ifelse(OS_IMIE=="*","",as.character(OS_IMIE)),
         opis = ifelse(!is.na(OS_NAZWISKO),paste(funkcja,OS_IMIE, OS_NAZWISKO, sep = " "),""),
         opis = str_replace_all(opis," +"," "),
         opis = ifelse(opis==" ","",as.character(opis))) %>%
  select(ZA_UWAGI,opis,jest_et_al) %>%
  group_by(ZA_UWAGI) %>%
  mutate(opis = paste(opis,collapse = ", "),
         jest_et_al = paste(unique(jest_et_al),sep = "")) %>%
  ungroup() %>%
  unique() %>%
  mutate(opis = ifelse(jest_et_al==TRUE&opis=="","et al.",
                       ifelse(jest_et_al,paste(opis,"et al.",sep = " "),opis))) %>%
  select(ZA_UWAGI,opis)

#700
marc_field_700 <- data %>%
  select(ZA_UWAGI,X700)%>%
  filter(X700!="") %>%
  mutate(X700=str_replace_all(X700,"(..\\$a)","|\\1"),
         X700=str_replace_all(X700,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X700",sep = "~",direction = "long") %>%
  filter(X700!="") %>%
  mutate(X700=str_remove_all(X700,"^\\|")) %>%
  mutate(indicator = str_replace_all(X700,"(^.*?)(\\$.*)","\\1")) %>%
  filter(X700!="")
subfield_list<- str_extract_all(data$X700,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_700)[1]))
colnames(empty_table) <-subfield_list
marc_field_700<-cbind(marc_field_700,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_700$X700 <- str_replace(marc_field_700$X700,subfield_list_char[i],"|\\1")
}
Progress: 1 on 9  Progress: 2 on 9  Progress: 3 on 9  Progress: 4 on 9  Progress: 5 on 9  Progress: 6 on 9  Progress: 7 on 9  Progress: 8 on 9  Progress: 9 on 9  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_700[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_700$X700),str_replace_all(gsub(string,"\\3",marc_field_700$X700),"\\${2}.", "~"),NA)
}
Progress: 1 on 9  Progress: 2 on 9  Progress: 3 on 9  Progress: 4 on 9  Progress: 5 on 9  Progress: 6 on 9  Progress: 7 on 9  Progress: 8 on 9  Progress: 9 on 9  
marc_field_700 <- marc_field_700 %>%
  select(ZA_UWAGI,osoba = `$a`,funkcja = `$e`) %>%
  filter(!is.na(funkcja)) %>%
  mutate(osoba = str_remove(osoba,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)"),
         OS_NAZWISKO = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\1"),as.character(osoba)),
         OS_IMIE = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\3"),"*"),
         funkcja_duza = str_to_lower(funkcja),
         opis = paste(funkcja_duza,OS_IMIE,OS_NAZWISKO, sep = " "),
         opis_duzy = paste(funkcja,OS_IMIE,OS_NAZWISKO, sep = " ")) %>%
  select(ZA_UWAGI,opis,opis_duzy) %>%
  group_by(ZA_UWAGI) %>%
  mutate(opis = paste(opis,collapse = ". "),
         opis_duzy = paste(opis_duzy,collapse = ". ")) %>%
  ungroup() %>%
  unique()

#opis współtwórców ze strefy odpowiedzialności 245
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,`$c`)

#porównanie opisu współtwórców z 245 i 700
wspoltworcy <- marc_field_700 %>%
  full_join(.,marc_field_245,by="ZA_UWAGI") %>%
  cSplit(.,"$c",sep = " ; ",direction = "long") %>%
  #ograniczanie osób ze strefy odpowiedzialności
  mutate(czy_mala = grepl(" [a-zęóąśłżźćń]|^[a-zęóąśłżźćń]|\\[[a-zęóąśłżźćń]",`$c`,ignore.case = FALSE)) %>%
  filter(czy_mala==TRUE) %>%
  select(-czy_mala) %>%
  #mutate(`$c` = gsub("^(\\[){0,1}([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])","\\1\\U\\2",perl = TRUE,`$c`)) %>%
  group_by(ZA_UWAGI) %>%
  mutate(X245 = paste(`$c`, collapse = ", ")) %>%
  select(-`$c`) %>%
  unique() %>%
  mutate(order_pbl = as.character(str_extract_all(opis,"(?<=^| |\\[|-)([A-ZAÁÀÂÃÄĂĀÅĄÆEÉÈÊËĚĒĖĘIÍÌÎÏĪĮIOÓÒÔÕÖŐØŒUÚÙÛÜŰŪůYÝCĆČçDĎĐĐGĢĞKĶLŁĻNŃÑŇŅŊRŘSŚŠŞSßTŤŦÞŢ8ZŻŹŽa-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])")),
         order_pbl = str_replace_all(order_pbl,"(.*?\")(.)(\".*?.)", "\\2"),
         order_bn = as.character(str_extract_all(X245,"(?<=^| |\\[|-)([A-ZAÁÀÂÃÄĂĀÅĄÆEÉÈÊËĚĒĖĘIÍÌÎÏĪĮIOÓÒÔÕÖŐØŒUÚÙÛÜŰŪůYÝCĆČçDĎĐĐGĢĞKĶLŁĻNŃÑŇŅŊRŘSŚŠŞSßTŤŦÞŢ8ZŻŹŽa-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])")),
         order_bn = str_replace_all(order_bn,"(.*?\")(.)(\".*?.)", "\\2"),
         X245 = str_remove(X245, "\\.$"),
         X245 = str_remove(X245, "\\["),
         X245 = str_remove(X245, "\\]"),
         order_pbl = str_remove_all(order_pbl, "[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]"),
         order_bn = str_remove_all(order_bn, "[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]"),
         to_samo = order_pbl==order_bn,
         X245 = gsub("(^[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(.*)","\\U\\1\\E\\2",perl = TRUE, X245)) %>%
  left_join(.,za_jezyk_oryginalu,by="ZA_UWAGI") %>%
  mutate(czy_pl = grepl("pol",ZA_JEZYK_ORYGINALU)|is.na(ZA_JEZYK_ORYGINALU),
         decyzja = ifelse(to_samo==FALSE|czy_pl==FALSE,FALSE,TRUE))

za_opis_wspoltworcow <- wspoltworcy %>%
  mutate(za_opis_wspoltworcow = ifelse(decyzja==TRUE,as.character(X245),paste(X245,opis_duzy,sep = "#"))) %>%
  select(ZA_UWAGI,opis_duzy,za_opis_wspoltworcow) %>%
  cSplit(.,"za_opis_wspoltworcow",sep = "#",direction = "wide") %>%
  mutate(za_opis_wspoltworcow_2 = ifelse(is.na(za_opis_wspoltworcow_2),'',as.character(za_opis_wspoltworcow_2)),
         to_samo = za_opis_wspoltworcow_1==za_opis_wspoltworcow_2) %>%
  filter(to_samo==FALSE) %>%
  group_by(ZA_UWAGI) %>%
  mutate(za_opis_wspoltworcow = paste(za_opis_wspoltworcow_1,za_opis_wspoltworcow_2,sep = "#"),
         za_opis_wspoltworcow = str_remove_all(za_opis_wspoltworcow,"\\#$")) %>%
  select(ZA_UWAGI,za_opis_wspoltworcow)

opis_wspoltworcow <- opis_wspoltworcow %>%
  filter(ZA_UWAGI %notin% za_opis_wspoltworcow$ZA_UWAGI) %>%
  filter(!is.na(opis)) %>%
  rename(za_opis_wspoltworcow = opis)

za_opis_wspoltworcow <- za_opis_wspoltworcow %>%
  bind_rows(.,opis_wspoltworcow) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#8 wydanie
marc_field_250 <- data %>%
  select(ZA_UWAGI,X250)%>%
  filter(X250!="") %>%
  mutate(X250=str_replace_all(X250,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X250",sep = "~",direction = "long") %>%
  filter(X250!="") %>%
  mutate(X250=str_remove_all(X250,"^\\|")) %>%
  mutate(indicator = str_replace_all(X250,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X250,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_250)[1]))
colnames(empty_table) <-subfield_list
marc_field_250<-cbind(marc_field_250,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_250$X250 <- str_replace(marc_field_250$X250,subfield_list_char[i],"|\\1")
}
Progress: 1 on 2  Progress: 2 on 2  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_250[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_250$X250),str_replace_all(gsub(string,"\\3",marc_field_250$X250),"\\${2}.", "~"),NA)
}
Progress: 1 on 2  Progress: 2 on 2  
za_wydanie <- marc_field_250 %>%
  select(ZA_UWAGI, wydanie = `$a`) %>%
  mutate(wydanie = str_remove(wydanie," \\/$")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#9: instytucja sprawcza
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
za_instytucja <- marc_field_245 %>%
  select(ZA_UWAGI,X245c=`$c`) %>%
  filter(!is.na(X245c)) %>%
  mutate(instytucja = ifelse(grepl("\\;",X245c),str_replace_all(X245c, "(.*?)(\\;(?!.*\\;))( )+(.*?$)","\\4"),"")) %>%
  left_join(.,BN_wspoltworca,by="ZA_UWAGI")

x <- 1:lengths(za_instytucja[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  za_instytucja$czy_nazwisko[i] <- grepl(za_instytucja$OS_NAZWISKO[i],za_instytucja$X245c[i])
  za_instytucja$czy_imie[i] <- grepl(za_instytucja$OS_IMIE[i],za_instytucja$X245c[i])
}
Progress:    1 on 2502  Progress:    2 on 2502  Progress:    3 on 2502  Progress:    4 on 2502  Progress:    5 on 2502  Progress:    6 on 2502  Progress:    7 on 2502  Progress:    8 on 2502  Progress:    9 on 2502  Progress:   10 on 2502  Progress:   11 on 2502  Progress:   12 on 2502  Progress:   13 on 2502  Progress:   14 on 2502  Progress:   15 on 2502  Progress:   16 on 2502  Progress:   17 on 2502  Progress:   18 on 2502  Progress:   19 on 2502  Progress:   20 on 2502  Progress:   21 on 2502  Progress:   22 on 2502  Progress:   23 on 2502  Progress:   24 on 2502  Progress:   25 on 2502  Progress:   26 on 2502  Progress:   27 on 2502  Progress:   28 on 2502  Progress:   29 on 2502  Progress:   30 on 2502  Progress:   31 on 2502  Progress:   32 on 2502  Progress:   33 on 2502  Progress:   34 on 2502  Progress:   35 on 2502  Progress:   36 on 2502  Progress:   37 on 2502  Progress:   38 on 2502  Progress:   39 on 2502  Progress:   40 on 2502  Progress:   41 on 2502  Progress:   42 on 2502  Progress:   43 on 2502  Progress:   44 on 2502  Progress:   45 on 2502  Progress:   46 on 2502  Progress:   47 on 2502  Progress:   48 on 2502  Progress:   49 on 2502  Progress:   50 on 2502  Progress:   51 on 2502  Progress:   52 on 2502  Progress:   53 on 2502  Progress:   54 on 2502  Progress:   55 on 2502  Progress:   56 on 2502  Progress:   57 on 2502  Progress:   58 on 2502  Progress:   59 on 2502  Progress:   60 on 2502  Progress:   61 on 2502  Progress:   62 on 2502  Progress:   63 on 2502  Progress:   64 on 2502  Progress:   65 on 2502  Progress:   66 on 2502  Progress:   67 on 2502  Progress:   68 on 2502  Progress:   69 on 2502  Progress:   70 on 2502  Progress:   71 on 2502  Progress:   72 on 2502  Progress:   73 on 2502  Progress:   74 on 2502  Progress:   75 on 2502  Progress:   76 on 2502  Progress:   77 on 2502  Progress:   78 on 2502  Progress:   79 on 2502  Progress:   80 on 2502  Progress:   81 on 2502  Progress:   82 on 2502  Progress:   83 on 2502  Progress:   84 on 2502  Progress:   85 on 2502  Progress:   86 on 2502  Progress:   87 on 2502  Progress:   88 on 2502  Progress:   89 on 2502  Progress:   90 on 2502  Progress:   91 on 2502  Progress:   92 on 2502  Progress:   93 on 2502  Progress:   94 on 2502  Progress:   95 on 2502  Progress:   96 on 2502  Progress:   97 on 2502  Progress:   98 on 2502  Progress:   99 on 2502  Progress:  100 on 2502  Progress:  101 on 2502  Progress:  102 on 2502  Progress:  103 on 2502  Progress:  104 on 2502  Progress:  105 on 2502  Progress:  106 on 2502  Progress:  107 on 2502  Progress:  108 on 2502  Progress:  109 on 2502  Progress:  110 on 2502  Progress:  111 on 2502  Progress:  112 on 2502  Progress:  113 on 2502  Progress:  114 on 2502  Progress:  115 on 2502  Progress:  116 on 2502  Progress:  117 on 2502  Progress:  118 on 2502  Progress:  119 on 2502  Progress:  120 on 2502  Progress:  121 on 2502  Progress:  122 on 2502  Progress:  123 on 2502  Progress:  124 on 2502  Progress:  125 on 2502  Progress:  126 on 2502  Progress:  127 on 2502  Progress:  128 on 2502  Progress:  129 on 2502  Progress:  130 on 2502  Progress:  131 on 2502  Progress:  132 on 2502  Progress:  133 on 2502  Progress:  134 on 2502  Progress:  135 on 2502  Progress:  136 on 2502  Progress:  137 on 2502  Progress:  138 on 2502  Progress:  139 on 2502  Progress:  140 on 2502  Progress:  141 on 2502  Progress:  142 on 2502  Progress:  143 on 2502  Progress:  144 on 2502  Progress:  145 on 2502  Progress:  146 on 2502  Progress:  147 on 2502  Progress:  148 on 2502  Progress:  149 on 2502  Progress:  150 on 2502  Progress:  151 on 2502  Progress:  152 on 2502  Progress:  153 on 2502  Progress:  154 on 2502  Progress:  155 on 2502  Progress:  156 on 2502  Progress:  157 on 2502  Progress:  158 on 2502  Progress:  159 on 2502  Progress:  160 on 2502  Progress:  161 on 2502  Progress:  162 on 2502  Progress:  163 on 2502  Progress:  164 on 2502  Progress:  165 on 2502  Progress:  166 on 2502  Progress:  167 on 2502  Progress:  168 on 2502  Progress:  169 on 2502  Progress:  170 on 2502  Progress:  171 on 2502  Progress:  172 on 2502  Progress:  173 on 2502  Progress:  174 on 2502  Progress:  175 on 2502  Progress:  176 on 2502  Progress:  177 on 2502  Progress:  178 on 2502  Progress:  179 on 2502  Progress:  180 on 2502  Progress:  181 on 2502  Progress:  182 on 2502  Progress:  183 on 2502  Progress:  184 on 2502  Progress:  185 on 2502  Progress:  186 on 2502  Progress:  187 on 2502  Progress:  188 on 2502  Progress:  189 on 2502  Progress:  190 on 2502  Progress:  191 on 2502  Progress:  192 on 2502  Progress:  193 on 2502  Progress:  194 on 2502  Progress:  195 on 2502  Progress:  196 on 2502  Progress:  197 on 2502  Progress:  198 on 2502  Progress:  199 on 2502  Progress:  200 on 2502  Progress:  201 on 2502  Progress:  202 on 2502  Progress:  203 on 2502  Progress:  204 on 2502  Progress:  205 on 2502  Progress:  206 on 2502  Progress:  207 on 2502  Progress:  208 on 2502  Progress:  209 on 2502  Progress:  210 on 2502  Progress:  211 on 2502  Progress:  212 on 2502  Progress:  213 on 2502  Progress:  214 on 2502  Progress:  215 on 2502  Progress:  216 on 2502  Progress:  217 on 2502  Progress:  218 on 2502  Progress:  219 on 2502  Progress:  220 on 2502  Progress:  221 on 2502  Progress:  222 on 2502  Progress:  223 on 2502  Progress:  224 on 2502  Progress:  225 on 2502  Progress:  226 on 2502  Progress:  227 on 2502  Progress:  228 on 2502  Progress:  229 on 2502  Progress:  230 on 2502  Progress:  231 on 2502  Progress:  232 on 2502  Progress:  233 on 2502  Progress:  234 on 2502  Progress:  235 on 2502  Progress:  236 on 2502  Progress:  237 on 2502  Progress:  238 on 2502  Progress:  239 on 2502  Progress:  240 on 2502  Progress:  241 on 2502  Progress:  242 on 2502  Progress:  243 on 2502  Progress:  244 on 2502  Progress:  245 on 2502  Progress:  246 on 2502  Progress:  247 on 2502  Progress:  248 on 2502  Progress:  249 on 2502  Progress:  250 on 2502  Progress:  251 on 2502  Progress:  252 on 2502  Progress:  253 on 2502  Progress:  254 on 2502  Progress:  255 on 2502  Progress:  256 on 2502  Progress:  257 on 2502  Progress:  258 on 2502  Progress:  259 on 2502  Progress:  260 on 2502  Progress:  261 on 2502  Progress:  262 on 2502  Progress:  263 on 2502  Progress:  264 on 2502  Progress:  265 on 2502  Progress:  266 on 2502  Progress:  267 on 2502  Progress:  268 on 2502  Progress:  269 on 2502  Progress:  270 on 2502  Progress:  271 on 2502  Progress:  272 on 2502  Progress:  273 on 2502  Progress:  274 on 2502  Progress:  275 on 2502  Progress:  276 on 2502  Progress:  277 on 2502  Progress:  278 on 2502  Progress:  279 on 2502  Progress:  280 on 2502  Progress:  281 on 2502  Progress:  282 on 2502  Progress:  283 on 2502  Progress:  284 on 2502  Progress:  285 on 2502  Progress:  286 on 2502  Progress:  287 on 2502  Progress:  288 on 2502  Progress:  289 on 2502  Progress:  290 on 2502  Progress:  291 on 2502  Progress:  292 on 2502  Progress:  293 on 2502  Progress:  294 on 2502  Progress:  295 on 2502  Progress:  296 on 2502  Progress:  297 on 2502  Progress:  298 on 2502  Progress:  299 on 2502  Progress:  300 on 2502  Progress:  301 on 2502  Progress:  302 on 2502  Progress:  303 on 2502  Progress:  304 on 2502  Progress:  305 on 2502  Progress:  306 on 2502  Progress:  307 on 2502  Progress:  308 on 2502  Progress:  309 on 2502  Progress:  310 on 2502  Progress:  311 on 2502  Progress:  312 on 2502  Progress:  313 on 2502  Progress:  314 on 2502  Progress:  315 on 2502  Progress:  316 on 2502  Progress:  317 on 2502  Progress:  318 on 2502  Progress:  319 on 2502  Progress:  320 on 2502  Progress:  321 on 2502  Progress:  322 on 2502  Progress:  323 on 2502  Progress:  324 on 2502  Progress:  325 on 2502  Progress:  326 on 2502  Progress:  327 on 2502  Progress:  328 on 2502  Progress:  329 on 2502  Progress:  330 on 2502  Progress:  331 on 2502  Progress:  332 on 2502  Progress:  333 on 2502  Progress:  334 on 2502  Progress:  335 on 2502  Progress:  336 on 2502  Progress:  337 on 2502  Progress:  338 on 2502  Progress:  339 on 2502  Progress:  340 on 2502  Progress:  341 on 2502  Progress:  342 on 2502  Progress:  343 on 2502  Progress:  344 on 2502  Progress:  345 on 2502  Progress:  346 on 2502  Progress:  347 on 2502  Progress:  348 on 2502  Progress:  349 on 2502  Progress:  350 on 2502  Progress:  351 on 2502  Progress:  352 on 2502  Progress:  353 on 2502  Progress:  354 on 2502  Progress:  355 on 2502  Progress:  356 on 2502  Progress:  357 on 2502  Progress:  358 on 2502  Progress:  359 on 2502  Progress:  360 on 2502  Progress:  361 on 2502  Progress:  362 on 2502  Progress:  363 on 2502  Progress:  364 on 2502  Progress:  365 on 2502  Progress:  366 on 2502  Progress:  367 on 2502  Progress:  368 on 2502  Progress:  369 on 2502  Progress:  370 on 2502  Progress:  371 on 2502  Progress:  372 on 2502  Progress:  373 on 2502  Progress:  374 on 2502  Progress:  375 on 2502  Progress:  376 on 2502  Progress:  377 on 2502  Progress:  378 on 2502  Progress:  379 on 2502  Progress:  380 on 2502  Progress:  381 on 2502  Progress:  382 on 2502  Progress:  383 on 2502  Progress:  384 on 2502  Progress:  385 on 2502  Progress:  386 on 2502  Progress:  387 on 2502  Progress:  388 on 2502  Progress:  389 on 2502  Progress:  390 on 2502  Progress:  391 on 2502  Progress:  392 on 2502  Progress:  393 on 2502  Progress:  394 on 2502  Progress:  395 on 2502  Progress:  396 on 2502  Progress:  397 on 2502  Progress:  398 on 2502  Progress:  399 on 2502  Progress:  400 on 2502  Progress:  401 on 2502  Progress:  402 on 2502  Progress:  403 on 2502  Progress:  404 on 2502  Progress:  405 on 2502  Progress:  406 on 2502  Progress:  407 on 2502  Progress:  408 on 2502  Progress:  409 on 2502  Progress:  410 on 2502  Progress:  411 on 2502  Progress:  412 on 2502  Progress:  413 on 2502  Progress:  414 on 2502  Progress:  415 on 2502  Progress:  416 on 2502  Progress:  417 on 2502  Progress:  418 on 2502  Progress:  419 on 2502  Progress:  420 on 2502  Progress:  421 on 2502  Progress:  422 on 2502  Progress:  423 on 2502  Progress:  424 on 2502  Progress:  425 on 2502  Progress:  426 on 2502  Progress:  427 on 2502  Progress:  428 on 2502  Progress:  429 on 2502  Progress:  430 on 2502  Progress:  431 on 2502  Progress:  432 on 2502  Progress:  433 on 2502  Progress:  434 on 2502  Progress:  435 on 2502  Progress:  436 on 2502  Progress:  437 on 2502  Progress:  438 on 2502  Progress:  439 on 2502  Progress:  440 on 2502  Progress:  441 on 2502  Progress:  442 on 2502  Progress:  443 on 2502  Progress:  444 on 2502  Progress:  445 on 2502  Progress:  446 on 2502  Progress:  447 on 2502  Progress:  448 on 2502  Progress:  449 on 2502  Progress:  450 on 2502  Progress:  451 on 2502  Progress:  452 on 2502  Progress:  453 on 2502  Progress:  454 on 2502  Progress:  455 on 2502  Progress:  456 on 2502  Progress:  457 on 2502  Progress:  458 on 2502  Progress:  459 on 2502  Progress:  460 on 2502  Progress:  461 on 2502  Progress:  462 on 2502  Progress:  463 on 2502  Progress:  464 on 2502  Progress:  465 on 2502  Progress:  466 on 2502  Progress:  467 on 2502  Progress:  468 on 2502  Progress:  469 on 2502  Progress:  470 on 2502  Progress:  471 on 2502  Progress:  472 on 2502  Progress:  473 on 2502  Progress:  474 on 2502  Progress:  475 on 2502  Progress:  476 on 2502  Progress:  477 on 2502  Progress:  478 on 2502  Progress:  479 on 2502  Progress:  480 on 2502  Progress:  481 on 2502  Progress:  482 on 2502  Progress:  483 on 2502  Progress:  484 on 2502  Progress:  485 on 2502  Progress:  486 on 2502  Progress:  487 on 2502  Progress:  488 on 2502  Progress:  489 on 2502  Progress:  490 on 2502  Progress:  491 on 2502  Progress:  492 on 2502  Progress:  493 on 2502  Progress:  494 on 2502  Progress:  495 on 2502  Progress:  496 on 2502  Progress:  497 on 2502  Progress:  498 on 2502  Progress:  499 on 2502  Progress:  500 on 2502  Progress:  501 on 2502  Progress:  502 on 2502  Progress:  503 on 2502  Progress:  504 on 2502  Progress:  505 on 2502  Progress:  506 on 2502  Progress:  507 on 2502  Progress:  508 on 2502  Progress:  509 on 2502  Progress:  510 on 2502  Progress:  511 on 2502  Progress:  512 on 2502  Progress:  513 on 2502  Progress:  514 on 2502  Progress:  515 on 2502  Progress:  516 on 2502  Progress:  517 on 2502  Progress:  518 on 2502  Progress:  519 on 2502  Progress:  520 on 2502  Progress:  521 on 2502  Progress:  522 on 2502  Progress:  523 on 2502  Progress:  524 on 2502  Progress:  525 on 2502  Progress:  526 on 2502  Progress:  527 on 2502  Progress:  528 on 2502  Progress:  529 on 2502  Progress:  530 on 2502  Progress:  531 on 2502  Progress:  532 on 2502  Progress:  533 on 2502  Progress:  534 on 2502  Progress:  535 on 2502  Progress:  536 on 2502  Progress:  537 on 2502  Progress:  538 on 2502  Progress:  539 on 2502  Progress:  540 on 2502  Progress:  541 on 2502  Progress:  542 on 2502  Progress:  543 on 2502  Progress:  544 on 2502  Progress:  545 on 2502  Progress:  546 on 2502  Progress:  547 on 2502  Progress:  548 on 2502  Progress:  549 on 2502  Progress:  550 on 2502  Progress:  551 on 2502  Progress:  552 on 2502  Progress:  553 on 2502  Progress:  554 on 2502  Progress:  555 on 2502  Progress:  556 on 2502  Progress:  557 on 2502  Progress:  558 on 2502  Progress:  559 on 2502  Progress:  560 on 2502  Progress:  561 on 2502  Progress:  562 on 2502  Progress:  563 on 2502  Progress:  564 on 2502  Progress:  565 on 2502  Progress:  566 on 2502  Progress:  567 on 2502  Progress:  568 on 2502  Progress:  569 on 2502  Progress:  570 on 2502  Progress:  571 on 2502  Progress:  572 on 2502  Progress:  573 on 2502  Progress:  574 on 2502  Progress:  575 on 2502  Progress:  576 on 2502  Progress:  577 on 2502  Progress:  578 on 2502  Progress:  579 on 2502  Progress:  580 on 2502  Progress:  581 on 2502  Progress:  582 on 2502  Progress:  583 on 2502  Progress:  584 on 2502  Progress:  585 on 2502  Progress:  586 on 2502  Progress:  587 on 2502  Progress:  588 on 2502  Progress:  589 on 2502  Progress:  590 on 2502  Progress:  591 on 2502  Progress:  592 on 2502  Progress:  593 on 2502  Progress:  594 on 2502  Progress:  595 on 2502  Progress:  596 on 2502  Progress:  597 on 2502  Progress:  598 on 2502  Progress:  599 on 2502  Progress:  600 on 2502  Progress:  601 on 2502  Progress:  602 on 2502  Progress:  603 on 2502  Progress:  604 on 2502  Progress:  605 on 2502  Progress:  606 on 2502  Progress:  607 on 2502  Progress:  608 on 2502  Progress:  609 on 2502  Progress:  610 on 2502  Progress:  611 on 2502  Progress:  612 on 2502  Progress:  613 on 2502  Progress:  614 on 2502  Progress:  615 on 2502  Progress:  616 on 2502  Progress:  617 on 2502  Progress:  618 on 2502  Progress:  619 on 2502  Progress:  620 on 2502  Progress:  621 on 2502  Progress:  622 on 2502  Progress:  623 on 2502  Progress:  624 on 2502  Progress:  625 on 2502  Progress:  626 on 2502  Progress:  627 on 2502  Progress:  628 on 2502  Progress:  629 on 2502  Progress:  630 on 2502  Progress:  631 on 2502  Progress:  632 on 2502  Progress:  633 on 2502  Progress:  634 on 2502  Progress:  635 on 2502  Progress:  636 on 2502  Progress:  637 on 2502  Progress:  638 on 2502  Progress:  639 on 2502  Progress:  640 on 2502  Progress:  641 on 2502  Progress:  642 on 2502  Progress:  643 on 2502  Progress:  644 on 2502  Progress:  645 on 2502  Progress:  646 on 2502  Progress:  647 on 2502  Progress:  648 on 2502  Progress:  649 on 2502  Progress:  650 on 2502  Progress:  651 on 2502  Progress:  652 on 2502  Progress:  653 on 2502  Progress:  654 on 2502  Progress:  655 on 2502  Progress:  656 on 2502  Progress:  657 on 2502  Progress:  658 on 2502  Progress:  659 on 2502  Progress:  660 on 2502  Progress:  661 on 2502  Progress:  662 on 2502  Progress:  663 on 2502  Progress:  664 on 2502  Progress:  665 on 2502  Progress:  666 on 2502  Progress:  667 on 2502  Progress:  668 on 2502  Progress:  669 on 2502  Progress:  670 on 2502  Progress:  671 on 2502  Progress:  672 on 2502  Progress:  673 on 2502  Progress:  674 on 2502  Progress:  675 on 2502  Progress:  676 on 2502  Progress:  677 on 2502  Progress:  678 on 2502  Progress:  679 on 2502  Progress:  680 on 2502  Progress:  681 on 2502  Progress:  682 on 2502  Progress:  683 on 2502  Progress:  684 on 2502  Progress:  685 on 2502  Progress:  686 on 2502  Progress:  687 on 2502  Progress:  688 on 2502  Progress:  689 on 2502  Progress:  690 on 2502  Progress:  691 on 2502  Progress:  692 on 2502  Progress:  693 on 2502  Progress:  694 on 2502  Progress:  695 on 2502  Progress:  696 on 2502  Progress:  697 on 2502  Progress:  698 on 2502  Progress:  699 on 2502  Progress:  700 on 2502  Progress:  701 on 2502  Progress:  702 on 2502  Progress:  703 on 2502  Progress:  704 on 2502  Progress:  705 on 2502  Progress:  706 on 2502  Progress:  707 on 2502  Progress:  708 on 2502  Progress:  709 on 2502  Progress:  710 on 2502  Progress:  711 on 2502  Progress:  712 on 2502  Progress:  713 on 2502  Progress:  714 on 2502  Progress:  715 on 2502  Progress:  716 on 2502  Progress:  717 on 2502  Progress:  718 on 2502  Progress:  719 on 2502  Progress:  720 on 2502  Progress:  721 on 2502  Progress:  722 on 2502  Progress:  723 on 2502  Progress:  724 on 2502  Progress:  725 on 2502  Progress:  726 on 2502  Progress:  727 on 2502  Progress:  728 on 2502  Progress:  729 on 2502  Progress:  730 on 2502  Progress:  731 on 2502  Progress:  732 on 2502  Progress:  733 on 2502  Progress:  734 on 2502  Progress:  735 on 2502  Progress:  736 on 2502  Progress:  737 on 2502  Progress:  738 on 2502  Progress:  739 on 2502  Progress:  740 on 2502  Progress:  741 on 2502  Progress:  742 on 2502  Progress:  743 on 2502  Progress:  744 on 2502  Progress:  745 on 2502  Progress:  746 on 2502  Progress:  747 on 2502  Progress:  748 on 2502  Progress:  749 on 2502  Progress:  750 on 2502  Progress:  751 on 2502  Progress:  752 on 2502  Progress:  753 on 2502  Progress:  754 on 2502  Progress:  755 on 2502  Progress:  756 on 2502  Progress:  757 on 2502  Progress:  758 on 2502  Progress:  759 on 2502  Progress:  760 on 2502  Progress:  761 on 2502  Progress:  762 on 2502  Progress:  763 on 2502  Progress:  764 on 2502  Progress:  765 on 2502  Progress:  766 on 2502  Progress:  767 on 2502  Progress:  768 on 2502  Progress:  769 on 2502  Progress:  770 on 2502  Progress:  771 on 2502  Progress:  772 on 2502  Progress:  773 on 2502  Progress:  774 on 2502  Progress:  775 on 2502  Progress:  776 on 2502  Progress:  777 on 2502  Progress:  778 on 2502  Progress:  779 on 2502  Progress:  780 on 2502  Progress:  781 on 2502  Progress:  782 on 2502  Progress:  783 on 2502  Progress:  784 on 2502  Progress:  785 on 2502  Progress:  786 on 2502  Progress:  787 on 2502  Progress:  788 on 2502  Progress:  789 on 2502  Progress:  790 on 2502  Progress:  791 on 2502  Progress:  792 on 2502  Progress:  793 on 2502  Progress:  794 on 2502  Progress:  795 on 2502  Progress:  796 on 2502  Progress:  797 on 2502  Progress:  798 on 2502  Progress:  799 on 2502  Progress:  800 on 2502  Progress:  801 on 2502  Progress:  802 on 2502  Progress:  803 on 2502  Progress:  804 on 2502  Progress:  805 on 2502  Progress:  806 on 2502  Progress:  807 on 2502  Progress:  808 on 2502  Progress:  809 on 2502  Progress:  810 on 2502  Progress:  811 on 2502  Progress:  812 on 2502  Progress:  813 on 2502  Progress:  814 on 2502  Progress:  815 on 2502  Progress:  816 on 2502  Progress:  817 on 2502  Progress:  818 on 2502  Progress:  819 on 2502  Progress:  820 on 2502  Progress:  821 on 2502  Progress:  822 on 2502  Progress:  823 on 2502  Progress:  824 on 2502  Progress:  825 on 2502  Progress:  826 on 2502  Progress:  827 on 2502  Progress:  828 on 2502  Progress:  829 on 2502  Progress:  830 on 2502  Progress:  831 on 2502  Progress:  832 on 2502  Progress:  833 on 2502  Progress:  834 on 2502  Progress:  835 on 2502  Progress:  836 on 2502  Progress:  837 on 2502  Progress:  838 on 2502  Progress:  839 on 2502  Progress:  840 on 2502  Progress:  841 on 2502  Progress:  842 on 2502  Progress:  843 on 2502  Progress:  844 on 2502  Progress:  845 on 2502  Progress:  846 on 2502  Progress:  847 on 2502  Progress:  848 on 2502  Progress:  849 on 2502  Progress:  850 on 2502  Progress:  851 on 2502  Progress:  852 on 2502  Progress:  853 on 2502  Progress:  854 on 2502  Progress:  855 on 2502  Progress:  856 on 2502  Progress:  857 on 2502  Progress:  858 on 2502  Progress:  859 on 2502  Progress:  860 on 2502  Progress:  861 on 2502  Progress:  862 on 2502  Progress:  863 on 2502  Progress:  864 on 2502  Progress:  865 on 2502  Progress:  866 on 2502  Progress:  867 on 2502  Progress:  868 on 2502  Progress:  869 on 2502  Progress:  870 on 2502  Progress:  871 on 2502  Progress:  872 on 2502  Progress:  873 on 2502  Progress:  874 on 2502  Progress:  875 on 2502  Progress:  876 on 2502  Progress:  877 on 2502  Progress:  878 on 2502  Progress:  879 on 2502  Progress:  880 on 2502  Progress:  881 on 2502  Progress:  882 on 2502  Progress:  883 on 2502  Progress:  884 on 2502  Progress:  885 on 2502  Progress:  886 on 2502  Progress:  887 on 2502  Progress:  888 on 2502  Progress:  889 on 2502  Progress:  890 on 2502  Progress:  891 on 2502  Progress:  892 on 2502  Progress:  893 on 2502  Progress:  894 on 2502  Progress:  895 on 2502  Progress:  896 on 2502  Progress:  897 on 2502  Progress:  898 on 2502  Progress:  899 on 2502  Progress:  900 on 2502  Progress:  901 on 2502  Progress:  902 on 2502  Progress:  903 on 2502  Progress:  904 on 2502  Progress:  905 on 2502  Progress:  906 on 2502  Progress:  907 on 2502  Progress:  908 on 2502  Progress:  909 on 2502  Progress:  910 on 2502  Progress:  911 on 2502  Progress:  912 on 2502  Progress:  913 on 2502  Progress:  914 on 2502  Progress:  915 on 2502  Progress:  916 on 2502  Progress:  917 on 2502  Progress:  918 on 2502  Progress:  919 on 2502  Progress:  920 on 2502  Progress:  921 on 2502  Progress:  922 on 2502  Progress:  923 on 2502  Progress:  924 on 2502  Progress:  925 on 2502  Progress:  926 on 2502  Progress:  927 on 2502  Progress:  928 on 2502  Progress:  929 on 2502  Progress:  930 on 2502  Progress:  931 on 2502  Progress:  932 on 2502  Progress:  933 on 2502  Progress:  934 on 2502  Progress:  935 on 2502  Progress:  936 on 2502  Progress:  937 on 2502  Progress:  938 on 2502  Progress:  939 on 2502  Progress:  940 on 2502  Progress:  941 on 2502  Progress:  942 on 2502  Progress:  943 on 2502  Progress:  944 on 2502  Progress:  945 on 2502  Progress:  946 on 2502  Progress:  947 on 2502  Progress:  948 on 2502  Progress:  949 on 2502  Progress:  950 on 2502  Progress:  951 on 2502  Progress:  952 on 2502  Progress:  953 on 2502  Progress:  954 on 2502  Progress:  955 on 2502  Progress:  956 on 2502  Progress:  957 on 2502  Progress:  958 on 2502  Progress:  959 on 2502  Progress:  960 on 2502  Progress:  961 on 2502  Progress:  962 on 2502  Progress:  963 on 2502  Progress:  964 on 2502  Progress:  965 on 2502  Progress:  966 on 2502  Progress:  967 on 2502  Progress:  968 on 2502  Progress:  969 on 2502  Progress:  970 on 2502  Progress:  971 on 2502  Progress:  972 on 2502  Progress:  973 on 2502  Progress:  974 on 2502  Progress:  975 on 2502  Progress:  976 on 2502  Progress:  977 on 2502  Progress:  978 on 2502  Progress:  979 on 2502  Progress:  980 on 2502  Progress:  981 on 2502  Progress:  982 on 2502  Progress:  983 on 2502  Progress:  984 on 2502  Progress:  985 on 2502  Progress:  986 on 2502  Progress:  987 on 2502  Progress:  988 on 2502  Progress:  989 on 2502  Progress:  990 on 2502  Progress:  991 on 2502  Progress:  992 on 2502  Progress:  993 on 2502  Progress:  994 on 2502  Progress:  995 on 2502  Progress:  996 on 2502  Progress:  997 on 2502  Progress:  998 on 2502  Progress:  999 on 2502  Progress: 1000 on 2502  Progress: 1001 on 2502  Progress: 1002 on 2502  Progress: 1003 on 2502  Progress: 1004 on 2502  Progress: 1005 on 2502  Progress: 1006 on 2502  Progress: 1007 on 2502  Progress: 1008 on 2502  Progress: 1009 on 2502  Progress: 1010 on 2502  Progress: 1011 on 2502  Progress: 1012 on 2502  Progress: 1013 on 2502  Progress: 1014 on 2502  Progress: 1015 on 2502  Progress: 1016 on 2502  Progress: 1017 on 2502  Progress: 1018 on 2502  Progress: 1019 on 2502  Progress: 1020 on 2502  Progress: 1021 on 2502  Progress: 1022 on 2502  Progress: 1023 on 2502  Progress: 1024 on 2502  Progress: 1025 on 2502  Progress: 1026 on 2502  Progress: 1027 on 2502  Progress: 1028 on 2502  Progress: 1029 on 2502  Progress: 1030 on 2502  Progress: 1031 on 2502  Progress: 1032 on 2502  Progress: 1033 on 2502  Progress: 1034 on 2502  Progress: 1035 on 2502  Progress: 1036 on 2502  Progress: 1037 on 2502  Progress: 1038 on 2502  Progress: 1039 on 2502  Progress: 1040 on 2502  Progress: 1041 on 2502  Progress: 1042 on 2502  Progress: 1043 on 2502  Progress: 1044 on 2502  Progress: 1045 on 2502  Progress: 1046 on 2502  Progress: 1047 on 2502  Progress: 1048 on 2502  Progress: 1049 on 2502  Progress: 1050 on 2502  Progress: 1051 on 2502  Progress: 1052 on 2502  Progress: 1053 on 2502  Progress: 1054 on 2502  Progress: 1055 on 2502  Progress: 1056 on 2502  Progress: 1057 on 2502  Progress: 1058 on 2502  Progress: 1059 on 2502  Progress: 1060 on 2502  Progress: 1061 on 2502  Progress: 1062 on 2502  Progress: 1063 on 2502  Progress: 1064 on 2502  Progress: 1065 on 2502  Progress: 1066 on 2502  Progress: 1067 on 2502  Progress: 1068 on 2502  Progress: 1069 on 2502  Progress: 1070 on 2502  Progress: 1071 on 2502  Progress: 1072 on 2502  Progress: 1073 on 2502  Progress: 1074 on 2502  Progress: 1075 on 2502  Progress: 1076 on 2502  Progress: 1077 on 2502  Progress: 1078 on 2502  Progress: 1079 on 2502  Progress: 1080 on 2502  Progress: 1081 on 2502  Progress: 1082 on 2502  Progress: 1083 on 2502  Progress: 1084 on 2502  Progress: 1085 on 2502  Progress: 1086 on 2502  Progress: 1087 on 2502  Progress: 1088 on 2502  Progress: 1089 on 2502  Progress: 1090 on 2502  Progress: 1091 on 2502  Progress: 1092 on 2502  Progress: 1093 on 2502  Progress: 1094 on 2502  Progress: 1095 on 2502  Progress: 1096 on 2502  Progress: 1097 on 2502  Progress: 1098 on 2502  Progress: 1099 on 2502  Progress: 1100 on 2502  Progress: 1101 on 2502  Progress: 1102 on 2502  Progress: 1103 on 2502  Progress: 1104 on 2502  Progress: 1105 on 2502  Progress: 1106 on 2502  Progress: 1107 on 2502  Progress: 1108 on 2502  Progress: 1109 on 2502  Progress: 1110 on 2502  Progress: 1111 on 2502  Progress: 1112 on 2502  Progress: 1113 on 2502  Progress: 1114 on 2502  Progress: 1115 on 2502  Progress: 1116 on 2502  Progress: 1117 on 2502  Progress: 1118 on 2502  Progress: 1119 on 2502  Progress: 1120 on 2502  Progress: 1121 on 2502  Progress: 1122 on 2502  Progress: 1123 on 2502  Progress: 1124 on 2502  Progress: 1125 on 2502  Progress: 1126 on 2502  Progress: 1127 on 2502  Progress: 1128 on 2502  Progress: 1129 on 2502  Progress: 1130 on 2502  Progress: 1131 on 2502  Progress: 1132 on 2502  Progress: 1133 on 2502  Progress: 1134 on 2502  Progress: 1135 on 2502  Progress: 1136 on 2502  Progress: 1137 on 2502  Progress: 1138 on 2502  Progress: 1139 on 2502  Progress: 1140 on 2502  Progress: 1141 on 2502  Progress: 1142 on 2502  Progress: 1143 on 2502  Progress: 1144 on 2502  Progress: 1145 on 2502  Progress: 1146 on 2502  Progress: 1147 on 2502  Progress: 1148 on 2502  Progress: 1149 on 2502  Progress: 1150 on 2502  Progress: 1151 on 2502  Progress: 1152 on 2502  Progress: 1153 on 2502  Progress: 1154 on 2502  Progress: 1155 on 2502  Progress: 1156 on 2502  Progress: 1157 on 2502  Progress: 1158 on 2502  Progress: 1159 on 2502  Progress: 1160 on 2502  Progress: 1161 on 2502  Progress: 1162 on 2502  Progress: 1163 on 2502  Progress: 1164 on 2502  Progress: 1165 on 2502  Progress: 1166 on 2502  Progress: 1167 on 2502  Progress: 1168 on 2502  Progress: 1169 on 2502  Progress: 1170 on 2502  Progress: 1171 on 2502  Progress: 1172 on 2502  Progress: 1173 on 2502  Progress: 1174 on 2502  Progress: 1175 on 2502  Progress: 1176 on 2502  Progress: 1177 on 2502  Progress: 1178 on 2502  Progress: 1179 on 2502  Progress: 1180 on 2502  Progress: 1181 on 2502  Progress: 1182 on 2502  Progress: 1183 on 2502  Progress: 1184 on 2502  Progress: 1185 on 2502  Progress: 1186 on 2502  Progress: 1187 on 2502  Progress: 1188 on 2502  Progress: 1189 on 2502  Progress: 1190 on 2502  Progress: 1191 on 2502  Progress: 1192 on 2502  Progress: 1193 on 2502  Progress: 1194 on 2502  Progress: 1195 on 2502  Progress: 1196 on 2502  Progress: 1197 on 2502  Progress: 1198 on 2502  Progress: 1199 on 2502  Progress: 1200 on 2502  Progress: 1201 on 2502  Progress: 1202 on 2502  Progress: 1203 on 2502  Progress: 1204 on 2502  Progress: 1205 on 2502  Progress: 1206 on 2502  Progress: 1207 on 2502  Progress: 1208 on 2502  Progress: 1209 on 2502  Progress: 1210 on 2502  Progress: 1211 on 2502  Progress: 1212 on 2502  Progress: 1213 on 2502  Progress: 1214 on 2502  Progress: 1215 on 2502  Progress: 1216 on 2502  Progress: 1217 on 2502  Progress: 1218 on 2502  Progress: 1219 on 2502  Progress: 1220 on 2502  Progress: 1221 on 2502  Progress: 1222 on 2502  Progress: 1223 on 2502  Progress: 1224 on 2502  Progress: 1225 on 2502  Progress: 1226 on 2502  Progress: 1227 on 2502  Progress: 1228 on 2502  Progress: 1229 on 2502  Progress: 1230 on 2502  Progress: 1231 on 2502  Progress: 1232 on 2502  Progress: 1233 on 2502  Progress: 1234 on 2502  Progress: 1235 on 2502  Progress: 1236 on 2502  Progress: 1237 on 2502  Progress: 1238 on 2502  Progress: 1239 on 2502  Progress: 1240 on 2502  Progress: 1241 on 2502  Progress: 1242 on 2502  Progress: 1243 on 2502  Progress: 1244 on 2502  Progress: 1245 on 2502  Progress: 1246 on 2502  Progress: 1247 on 2502  Progress: 1248 on 2502  Progress: 1249 on 2502  Progress: 1250 on 2502  Progress: 1251 on 2502  Progress: 1252 on 2502  Progress: 1253 on 2502  Progress: 1254 on 2502  Progress: 1255 on 2502  Progress: 1256 on 2502  Progress: 1257 on 2502  Progress: 1258 on 2502  Progress: 1259 on 2502  Progress: 1260 on 2502  Progress: 1261 on 2502  Progress: 1262 on 2502  Progress: 1263 on 2502  Progress: 1264 on 2502  Progress: 1265 on 2502  Progress: 1266 on 2502  Progress: 1267 on 2502  Progress: 1268 on 2502  Progress: 1269 on 2502  Progress: 1270 on 2502  Progress: 1271 on 2502  Progress: 1272 on 2502  Progress: 1273 on 2502  Progress: 1274 on 2502  Progress: 1275 on 2502  Progress: 1276 on 2502  Progress: 1277 on 2502  Progress: 1278 on 2502  Progress: 1279 on 2502  Progress: 1280 on 2502  Progress: 1281 on 2502  Progress: 1282 on 2502  Progress: 1283 on 2502  Progress: 1284 on 2502  Progress: 1285 on 2502  Progress: 1286 on 2502  Progress: 1287 on 2502  Progress: 1288 on 2502  Progress: 1289 on 2502  Progress: 1290 on 2502  Progress: 1291 on 2502  Progress: 1292 on 2502  Progress: 1293 on 2502  Progress: 1294 on 2502  Progress: 1295 on 2502  Progress: 1296 on 2502  Progress: 1297 on 2502  Progress: 1298 on 2502  Progress: 1299 on 2502  Progress: 1300 on 2502  Progress: 1301 on 2502  Progress: 1302 on 2502  Progress: 1303 on 2502  Progress: 1304 on 2502  Progress: 1305 on 2502  Progress: 1306 on 2502  Progress: 1307 on 2502  Progress: 1308 on 2502  Progress: 1309 on 2502  Progress: 1310 on 2502  Progress: 1311 on 2502  Progress: 1312 on 2502  Progress: 1313 on 2502  Progress: 1314 on 2502  Progress: 1315 on 2502  Progress: 1316 on 2502  Progress: 1317 on 2502  Progress: 1318 on 2502  Progress: 1319 on 2502  Progress: 1320 on 2502  Progress: 1321 on 2502  Progress: 1322 on 2502  Progress: 1323 on 2502  Progress: 1324 on 2502  Progress: 1325 on 2502  Progress: 1326 on 2502  Progress: 1327 on 2502  Progress: 1328 on 2502  Progress: 1329 on 2502  Progress: 1330 on 2502  Progress: 1331 on 2502  Progress: 1332 on 2502  Progress: 1333 on 2502  Progress: 1334 on 2502  Progress: 1335 on 2502  Progress: 1336 on 2502  Progress: 1337 on 2502  Progress: 1338 on 2502  Progress: 1339 on 2502  Progress: 1340 on 2502  Progress: 1341 on 2502  Progress: 1342 on 2502  Progress: 1343 on 2502  Progress: 1344 on 2502  Progress: 1345 on 2502  Progress: 1346 on 2502  Progress: 1347 on 2502  Progress: 1348 on 2502  Progress: 1349 on 2502  Progress: 1350 on 2502  Progress: 1351 on 2502  Progress: 1352 on 2502  Progress: 1353 on 2502  Progress: 1354 on 2502  Progress: 1355 on 2502  Progress: 1356 on 2502  Progress: 1357 on 2502  Progress: 1358 on 2502  Progress: 1359 on 2502  Progress: 1360 on 2502  Progress: 1361 on 2502  Progress: 1362 on 2502  Progress: 1363 on 2502  Progress: 1364 on 2502  Progress: 1365 on 2502  Progress: 1366 on 2502  Progress: 1367 on 2502  Progress: 1368 on 2502  Progress: 1369 on 2502  Progress: 1370 on 2502  Progress: 1371 on 2502  Progress: 1372 on 2502  Progress: 1373 on 2502  Progress: 1374 on 2502  Progress: 1375 on 2502  Progress: 1376 on 2502  Progress: 1377 on 2502  Progress: 1378 on 2502  Progress: 1379 on 2502  Progress: 1380 on 2502  Progress: 1381 on 2502  Progress: 1382 on 2502  Progress: 1383 on 2502  Progress: 1384 on 2502  Progress: 1385 on 2502  Progress: 1386 on 2502  Progress: 1387 on 2502  Progress: 1388 on 2502  Progress: 1389 on 2502  Progress: 1390 on 2502  Progress: 1391 on 2502  Progress: 1392 on 2502  Progress: 1393 on 2502  Progress: 1394 on 2502  Progress: 1395 on 2502  Progress: 1396 on 2502  Progress: 1397 on 2502  Progress: 1398 on 2502  Progress: 1399 on 2502  Progress: 1400 on 2502  Progress: 1401 on 2502  Progress: 1402 on 2502  Progress: 1403 on 2502  Progress: 1404 on 2502  Progress: 1405 on 2502  Progress: 1406 on 2502  Progress: 1407 on 2502  Progress: 1408 on 2502  Progress: 1409 on 2502  Progress: 1410 on 2502  Progress: 1411 on 2502  Progress: 1412 on 2502  Progress: 1413 on 2502  Progress: 1414 on 2502  Progress: 1415 on 2502  Progress: 1416 on 2502  Progress: 1417 on 2502  Progress: 1418 on 2502  Progress: 1419 on 2502  Progress: 1420 on 2502  Progress: 1421 on 2502  Progress: 1422 on 2502  Progress: 1423 on 2502  Progress: 1424 on 2502  Progress: 1425 on 2502  Progress: 1426 on 2502  Progress: 1427 on 2502  Progress: 1428 on 2502  Progress: 1429 on 2502  Progress: 1430 on 2502  Progress: 1431 on 2502  Progress: 1432 on 2502  Progress: 1433 on 2502  Progress: 1434 on 2502  Progress: 1435 on 2502  Progress: 1436 on 2502  Progress: 1437 on 2502  Progress: 1438 on 2502  Progress: 1439 on 2502  Progress: 1440 on 2502  Progress: 1441 on 2502  Progress: 1442 on 2502  Progress: 1443 on 2502  Progress: 1444 on 2502  Progress: 1445 on 2502  Progress: 1446 on 2502  Progress: 1447 on 2502  Progress: 1448 on 2502  Progress: 1449 on 2502  Progress: 1450 on 2502  Progress: 1451 on 2502  Progress: 1452 on 2502  Progress: 1453 on 2502  Progress: 1454 on 2502  Progress: 1455 on 2502  Progress: 1456 on 2502  Progress: 1457 on 2502  Progress: 1458 on 2502  Progress: 1459 on 2502  Progress: 1460 on 2502  Progress: 1461 on 2502  Progress: 1462 on 2502  Progress: 1463 on 2502  Progress: 1464 on 2502  Progress: 1465 on 2502  Progress: 1466 on 2502  Progress: 1467 on 2502  Progress: 1468 on 2502  Progress: 1469 on 2502  Progress: 1470 on 2502  Progress: 1471 on 2502  Progress: 1472 on 2502  Progress: 1473 on 2502  Progress: 1474 on 2502  Progress: 1475 on 2502  Progress: 1476 on 2502  Progress: 1477 on 2502  Progress: 1478 on 2502  Progress: 1479 on 2502  Progress: 1480 on 2502  Progress: 1481 on 2502  Progress: 1482 on 2502  Progress: 1483 on 2502  Progress: 1484 on 2502  Progress: 1485 on 2502  Progress: 1486 on 2502  Progress: 1487 on 2502  Progress: 1488 on 2502  Progress: 1489 on 2502  Progress: 1490 on 2502  Progress: 1491 on 2502  Progress: 1492 on 2502  Progress: 1493 on 2502  Progress: 1494 on 2502  Progress: 1495 on 2502  Progress: 1496 on 2502  Progress: 1497 on 2502  Progress: 1498 on 2502  Progress: 1499 on 2502  Progress: 1500 on 2502  Progress: 1501 on 2502  Progress: 1502 on 2502  Progress: 1503 on 2502  Progress: 1504 on 2502  Progress: 1505 on 2502  Progress: 1506 on 2502  Progress: 1507 on 2502  Progress: 1508 on 2502  Progress: 1509 on 2502  Progress: 1510 on 2502  Progress: 1511 on 2502  Progress: 1512 on 2502  Progress: 1513 on 2502  Progress: 1514 on 2502  Progress: 1515 on 2502  Progress: 1516 on 2502  Progress: 1517 on 2502  Progress: 1518 on 2502  Progress: 1519 on 2502  Progress: 1520 on 2502  Progress: 1521 on 2502  Progress: 1522 on 2502  Progress: 1523 on 2502  Progress: 1524 on 2502  Progress: 1525 on 2502  Progress: 1526 on 2502  Progress: 1527 on 2502  Progress: 1528 on 2502  Progress: 1529 on 2502  Progress: 1530 on 2502  Progress: 1531 on 2502  Progress: 1532 on 2502  Progress: 1533 on 2502  Progress: 1534 on 2502  Progress: 1535 on 2502  Progress: 1536 on 2502  Progress: 1537 on 2502  Progress: 1538 on 2502  Progress: 1539 on 2502  Progress: 1540 on 2502  Progress: 1541 on 2502  Progress: 1542 on 2502  Progress: 1543 on 2502  Progress: 1544 on 2502  Progress: 1545 on 2502  Progress: 1546 on 2502  Progress: 1547 on 2502  Progress: 1548 on 2502  Progress: 1549 on 2502  Progress: 1550 on 2502  Progress: 1551 on 2502  Progress: 1552 on 2502  Progress: 1553 on 2502  Progress: 1554 on 2502  Progress: 1555 on 2502  Progress: 1556 on 2502  Progress: 1557 on 2502  Progress: 1558 on 2502  Progress: 1559 on 2502  Progress: 1560 on 2502  Progress: 1561 on 2502  Progress: 1562 on 2502  Progress: 1563 on 2502  Progress: 1564 on 2502  Progress: 1565 on 2502  Progress: 1566 on 2502  Progress: 1567 on 2502  Progress: 1568 on 2502  Progress: 1569 on 2502  Progress: 1570 on 2502  Progress: 1571 on 2502  Progress: 1572 on 2502  Progress: 1573 on 2502  Progress: 1574 on 2502  Progress: 1575 on 2502  Progress: 1576 on 2502  Progress: 1577 on 2502  Progress: 1578 on 2502  Progress: 1579 on 2502  Progress: 1580 on 2502  Progress: 1581 on 2502  Progress: 1582 on 2502  Progress: 1583 on 2502  Progress: 1584 on 2502  Progress: 1585 on 2502  Progress: 1586 on 2502  Progress: 1587 on 2502  Progress: 1588 on 2502  Progress: 1589 on 2502  Progress: 1590 on 2502  Progress: 1591 on 2502  Progress: 1592 on 2502  Progress: 1593 on 2502  Progress: 1594 on 2502  Progress: 1595 on 2502  Progress: 1596 on 2502  Progress: 1597 on 2502  Progress: 1598 on 2502  Progress: 1599 on 2502  Progress: 1600 on 2502  Progress: 1601 on 2502  Progress: 1602 on 2502  Progress: 1603 on 2502  Progress: 1604 on 2502  Progress: 1605 on 2502  Progress: 1606 on 2502  Progress: 1607 on 2502  Progress: 1608 on 2502  Progress: 1609 on 2502  Progress: 1610 on 2502  Progress: 1611 on 2502  Progress: 1612 on 2502  Progress: 1613 on 2502  Progress: 1614 on 2502  Progress: 1615 on 2502  Progress: 1616 on 2502  Progress: 1617 on 2502  Progress: 1618 on 2502  Progress: 1619 on 2502  Progress: 1620 on 2502  Progress: 1621 on 2502  Progress: 1622 on 2502  Progress: 1623 on 2502  Progress: 1624 on 2502  Progress: 1625 on 2502  Progress: 1626 on 2502  Progress: 1627 on 2502  Progress: 1628 on 2502  Progress: 1629 on 2502  Progress: 1630 on 2502  Progress: 1631 on 2502  Progress: 1632 on 2502  Progress: 1633 on 2502  Progress: 1634 on 2502  Progress: 1635 on 2502  Progress: 1636 on 2502  Progress: 1637 on 2502  Progress: 1638 on 2502  Progress: 1639 on 2502  Progress: 1640 on 2502  Progress: 1641 on 2502  Progress: 1642 on 2502  Progress: 1643 on 2502  Progress: 1644 on 2502  Progress: 1645 on 2502  Progress: 1646 on 2502  Progress: 1647 on 2502  Progress: 1648 on 2502  Progress: 1649 on 2502  Progress: 1650 on 2502  Progress: 1651 on 2502  Progress: 1652 on 2502  Progress: 1653 on 2502  Progress: 1654 on 2502  Progress: 1655 on 2502  Progress: 1656 on 2502  Progress: 1657 on 2502  Progress: 1658 on 2502  Progress: 1659 on 2502  Progress: 1660 on 2502  Progress: 1661 on 2502  Progress: 1662 on 2502  Progress: 1663 on 2502  Progress: 1664 on 2502  Progress: 1665 on 2502  Progress: 1666 on 2502  Progress: 1667 on 2502  Progress: 1668 on 2502  Progress: 1669 on 2502  Progress: 1670 on 2502  Progress: 1671 on 2502  Progress: 1672 on 2502  Progress: 1673 on 2502  Progress: 1674 on 2502  Progress: 1675 on 2502  Progress: 1676 on 2502  Progress: 1677 on 2502  Progress: 1678 on 2502  Progress: 1679 on 2502  Progress: 1680 on 2502  Progress: 1681 on 2502  Progress: 1682 on 2502  Progress: 1683 on 2502  Progress: 1684 on 2502  Progress: 1685 on 2502  Progress: 1686 on 2502  Progress: 1687 on 2502  Progress: 1688 on 2502  Progress: 1689 on 2502  Progress: 1690 on 2502  Progress: 1691 on 2502  Progress: 1692 on 2502  Progress: 1693 on 2502  Progress: 1694 on 2502  Progress: 1695 on 2502  Progress: 1696 on 2502  Progress: 1697 on 2502  Progress: 1698 on 2502  Progress: 1699 on 2502  Progress: 1700 on 2502  Progress: 1701 on 2502  Progress: 1702 on 2502  Progress: 1703 on 2502  Progress: 1704 on 2502  Progress: 1705 on 2502  Progress: 1706 on 2502  Progress: 1707 on 2502  Progress: 1708 on 2502  Progress: 1709 on 2502  Progress: 1710 on 2502  Progress: 1711 on 2502  Progress: 1712 on 2502  Progress: 1713 on 2502  Progress: 1714 on 2502  Progress: 1715 on 2502  Progress: 1716 on 2502  Progress: 1717 on 2502  Progress: 1718 on 2502  Progress: 1719 on 2502  Progress: 1720 on 2502  Progress: 1721 on 2502  Progress: 1722 on 2502  Progress: 1723 on 2502  Progress: 1724 on 2502  Progress: 1725 on 2502  Progress: 1726 on 2502  Progress: 1727 on 2502  Progress: 1728 on 2502  Progress: 1729 on 2502  Progress: 1730 on 2502  Progress: 1731 on 2502  Progress: 1732 on 2502  Progress: 1733 on 2502  Progress: 1734 on 2502  Progress: 1735 on 2502  Progress: 1736 on 2502  Progress: 1737 on 2502  Progress: 1738 on 2502  Progress: 1739 on 2502  Progress: 1740 on 2502  Progress: 1741 on 2502  Progress: 1742 on 2502  Progress: 1743 on 2502  Progress: 1744 on 2502  Progress: 1745 on 2502  Progress: 1746 on 2502  Progress: 1747 on 2502  Progress: 1748 on 2502  Progress: 1749 on 2502  Progress: 1750 on 2502  Progress: 1751 on 2502  Progress: 1752 on 2502  Progress: 1753 on 2502  Progress: 1754 on 2502  Progress: 1755 on 2502  Progress: 1756 on 2502  Progress: 1757 on 2502  Progress: 1758 on 2502  Progress: 1759 on 2502  Progress: 1760 on 2502  Progress: 1761 on 2502  Progress: 1762 on 2502  Progress: 1763 on 2502  Progress: 1764 on 2502  Progress: 1765 on 2502  Progress: 1766 on 2502  Progress: 1767 on 2502  Progress: 1768 on 2502  Progress: 1769 on 2502  Progress: 1770 on 2502  Progress: 1771 on 2502  Progress: 1772 on 2502  Progress: 1773 on 2502  Progress: 1774 on 2502  Progress: 1775 on 2502  Progress: 1776 on 2502  Progress: 1777 on 2502  Progress: 1778 on 2502  Progress: 1779 on 2502  Progress: 1780 on 2502  Progress: 1781 on 2502  Progress: 1782 on 2502  Progress: 1783 on 2502  Progress: 1784 on 2502  Progress: 1785 on 2502  Progress: 1786 on 2502  Progress: 1787 on 2502  Progress: 1788 on 2502  Progress: 1789 on 2502  Progress: 1790 on 2502  Progress: 1791 on 2502  Progress: 1792 on 2502  Progress: 1793 on 2502  Progress: 1794 on 2502  Progress: 1795 on 2502  Progress: 1796 on 2502  Progress: 1797 on 2502  Progress: 1798 on 2502  Progress: 1799 on 2502  Progress: 1800 on 2502  Progress: 1801 on 2502  Progress: 1802 on 2502  Progress: 1803 on 2502  Progress: 1804 on 2502  Progress: 1805 on 2502  Progress: 1806 on 2502  Progress: 1807 on 2502  Progress: 1808 on 2502  Progress: 1809 on 2502  Progress: 1810 on 2502  Progress: 1811 on 2502  Progress: 1812 on 2502  Progress: 1813 on 2502  Progress: 1814 on 2502  Progress: 1815 on 2502  Progress: 1816 on 2502  Progress: 1817 on 2502  Progress: 1818 on 2502  Progress: 1819 on 2502  Progress: 1820 on 2502  Progress: 1821 on 2502  Progress: 1822 on 2502  Progress: 1823 on 2502  Progress: 1824 on 2502  Progress: 1825 on 2502  Progress: 1826 on 2502  Progress: 1827 on 2502  Progress: 1828 on 2502  Progress: 1829 on 2502  Progress: 1830 on 2502  Progress: 1831 on 2502  Progress: 1832 on 2502  Progress: 1833 on 2502  Progress: 1834 on 2502  Progress: 1835 on 2502  Progress: 1836 on 2502  Progress: 1837 on 2502  Progress: 1838 on 2502  Progress: 1839 on 2502  Progress: 1840 on 2502  Progress: 1841 on 2502  Progress: 1842 on 2502  Progress: 1843 on 2502  Progress: 1844 on 2502  Progress: 1845 on 2502  Progress: 1846 on 2502  Progress: 1847 on 2502  Progress: 1848 on 2502  Progress: 1849 on 2502  Progress: 1850 on 2502  Progress: 1851 on 2502  Progress: 1852 on 2502  Progress: 1853 on 2502  Progress: 1854 on 2502  Progress: 1855 on 2502  Progress: 1856 on 2502  Progress: 1857 on 2502  Progress: 1858 on 2502  Progress: 1859 on 2502  Progress: 1860 on 2502  Progress: 1861 on 2502  Progress: 1862 on 2502  Progress: 1863 on 2502  Progress: 1864 on 2502  Progress: 1865 on 2502  Progress: 1866 on 2502  Progress: 1867 on 2502  Progress: 1868 on 2502  Progress: 1869 on 2502  Progress: 1870 on 2502  Progress: 1871 on 2502  Progress: 1872 on 2502  Progress: 1873 on 2502  Progress: 1874 on 2502  Progress: 1875 on 2502  Progress: 1876 on 2502  Progress: 1877 on 2502  Progress: 1878 on 2502  Progress: 1879 on 2502  Progress: 1880 on 2502  Progress: 1881 on 2502  Progress: 1882 on 2502  Progress: 1883 on 2502  Progress: 1884 on 2502  Progress: 1885 on 2502  Progress: 1886 on 2502  Progress: 1887 on 2502  Progress: 1888 on 2502  Progress: 1889 on 2502  Progress: 1890 on 2502  Progress: 1891 on 2502  Progress: 1892 on 2502  Progress: 1893 on 2502  Progress: 1894 on 2502  Progress: 1895 on 2502  Progress: 1896 on 2502  Progress: 1897 on 2502  Progress: 1898 on 2502  Progress: 1899 on 2502  Progress: 1900 on 2502  Progress: 1901 on 2502  Progress: 1902 on 2502  Progress: 1903 on 2502  Progress: 1904 on 2502  Progress: 1905 on 2502  Progress: 1906 on 2502  Progress: 1907 on 2502  Progress: 1908 on 2502  Progress: 1909 on 2502  Progress: 1910 on 2502  Progress: 1911 on 2502  Progress: 1912 on 2502  Progress: 1913 on 2502  Progress: 1914 on 2502  Progress: 1915 on 2502  Progress: 1916 on 2502  Progress: 1917 on 2502  Progress: 1918 on 2502  Progress: 1919 on 2502  Progress: 1920 on 2502  Progress: 1921 on 2502  Progress: 1922 on 2502  Progress: 1923 on 2502  Progress: 1924 on 2502  Progress: 1925 on 2502  Progress: 1926 on 2502  Progress: 1927 on 2502  Progress: 1928 on 2502  Progress: 1929 on 2502  Progress: 1930 on 2502  Progress: 1931 on 2502  Progress: 1932 on 2502  Progress: 1933 on 2502  Progress: 1934 on 2502  Progress: 1935 on 2502  Progress: 1936 on 2502  Progress: 1937 on 2502  Progress: 1938 on 2502  Progress: 1939 on 2502  Progress: 1940 on 2502  Progress: 1941 on 2502  Progress: 1942 on 2502  Progress: 1943 on 2502  Progress: 1944 on 2502  Progress: 1945 on 2502  Progress: 1946 on 2502  Progress: 1947 on 2502  Progress: 1948 on 2502  Progress: 1949 on 2502  Progress: 1950 on 2502  Progress: 1951 on 2502  Progress: 1952 on 2502  Progress: 1953 on 2502  Progress: 1954 on 2502  Progress: 1955 on 2502  Progress: 1956 on 2502  Progress: 1957 on 2502  Progress: 1958 on 2502  Progress: 1959 on 2502  Progress: 1960 on 2502  Progress: 1961 on 2502  Progress: 1962 on 2502  Progress: 1963 on 2502  Progress: 1964 on 2502  Progress: 1965 on 2502  Progress: 1966 on 2502  Progress: 1967 on 2502  Progress: 1968 on 2502  Progress: 1969 on 2502  Progress: 1970 on 2502  Progress: 1971 on 2502  Progress: 1972 on 2502  Progress: 1973 on 2502  Progress: 1974 on 2502  Progress: 1975 on 2502  Progress: 1976 on 2502  Progress: 1977 on 2502  Progress: 1978 on 2502  Progress: 1979 on 2502  Progress: 1980 on 2502  Progress: 1981 on 2502  Progress: 1982 on 2502  Progress: 1983 on 2502  Progress: 1984 on 2502  Progress: 1985 on 2502  Progress: 1986 on 2502  Progress: 1987 on 2502  Progress: 1988 on 2502  Progress: 1989 on 2502  Progress: 1990 on 2502  Progress: 1991 on 2502  Progress: 1992 on 2502  Progress: 1993 on 2502  Progress: 1994 on 2502  Progress: 1995 on 2502  Progress: 1996 on 2502  Progress: 1997 on 2502  Progress: 1998 on 2502  Progress: 1999 on 2502  Progress: 2000 on 2502  Progress: 2001 on 2502  Progress: 2002 on 2502  Progress: 2003 on 2502  Progress: 2004 on 2502  Progress: 2005 on 2502  Progress: 2006 on 2502  Progress: 2007 on 2502  Progress: 2008 on 2502  Progress: 2009 on 2502  Progress: 2010 on 2502  Progress: 2011 on 2502  Progress: 2012 on 2502  Progress: 2013 on 2502  Progress: 2014 on 2502  Progress: 2015 on 2502  Progress: 2016 on 2502  Progress: 2017 on 2502  Progress: 2018 on 2502  Progress: 2019 on 2502  Progress: 2020 on 2502  Progress: 2021 on 2502  Progress: 2022 on 2502  Progress: 2023 on 2502  Progress: 2024 on 2502  Progress: 2025 on 2502  Progress: 2026 on 2502  Progress: 2027 on 2502  Progress: 2028 on 2502  Progress: 2029 on 2502  Progress: 2030 on 2502  Progress: 2031 on 2502  Progress: 2032 on 2502  Progress: 2033 on 2502  Progress: 2034 on 2502  Progress: 2035 on 2502  Progress: 2036 on 2502  Progress: 2037 on 2502  Progress: 2038 on 2502  Progress: 2039 on 2502  Progress: 2040 on 2502  Progress: 2041 on 2502  Progress: 2042 on 2502  Progress: 2043 on 2502  Progress: 2044 on 2502  Progress: 2045 on 2502  Progress: 2046 on 2502  Progress: 2047 on 2502  Progress: 2048 on 2502  Progress: 2049 on 2502  Progress: 2050 on 2502  Progress: 2051 on 2502  Progress: 2052 on 2502  Progress: 2053 on 2502  Progress: 2054 on 2502  Progress: 2055 on 2502  Progress: 2056 on 2502  Progress: 2057 on 2502  Progress: 2058 on 2502  Progress: 2059 on 2502  Progress: 2060 on 2502  Progress: 2061 on 2502  Progress: 2062 on 2502  Progress: 2063 on 2502  Progress: 2064 on 2502  Progress: 2065 on 2502  Progress: 2066 on 2502  Progress: 2067 on 2502  Progress: 2068 on 2502  Progress: 2069 on 2502  Progress: 2070 on 2502  Progress: 2071 on 2502  Progress: 2072 on 2502  Progress: 2073 on 2502  Progress: 2074 on 2502  Progress: 2075 on 2502  Progress: 2076 on 2502  Progress: 2077 on 2502  Progress: 2078 on 2502  Progress: 2079 on 2502  Progress: 2080 on 2502  Progress: 2081 on 2502  Progress: 2082 on 2502  Progress: 2083 on 2502  Progress: 2084 on 2502  Progress: 2085 on 2502  Progress: 2086 on 2502  Progress: 2087 on 2502  Progress: 2088 on 2502  Progress: 2089 on 2502  Progress: 2090 on 2502  Progress: 2091 on 2502  Progress: 2092 on 2502  Progress: 2093 on 2502  Progress: 2094 on 2502  Progress: 2095 on 2502  Progress: 2096 on 2502  Progress: 2097 on 2502  Progress: 2098 on 2502  Progress: 2099 on 2502  Progress: 2100 on 2502  Progress: 2101 on 2502  Progress: 2102 on 2502  Progress: 2103 on 2502  Progress: 2104 on 2502  Progress: 2105 on 2502  Progress: 2106 on 2502  Progress: 2107 on 2502  Progress: 2108 on 2502  Progress: 2109 on 2502  Progress: 2110 on 2502  Progress: 2111 on 2502  Progress: 2112 on 2502  Progress: 2113 on 2502  Progress: 2114 on 2502  Progress: 2115 on 2502  Progress: 2116 on 2502  Progress: 2117 on 2502  Progress: 2118 on 2502  Progress: 2119 on 2502  Progress: 2120 on 2502  Progress: 2121 on 2502  Progress: 2122 on 2502  Progress: 2123 on 2502  Progress: 2124 on 2502  Progress: 2125 on 2502  Progress: 2126 on 2502  Progress: 2127 on 2502  Progress: 2128 on 2502  Progress: 2129 on 2502  Progress: 2130 on 2502  Progress: 2131 on 2502  Progress: 2132 on 2502  Progress: 2133 on 2502  Progress: 2134 on 2502  Progress: 2135 on 2502  Progress: 2136 on 2502  Progress: 2137 on 2502  Progress: 2138 on 2502  Progress: 2139 on 2502  Progress: 2140 on 2502  Progress: 2141 on 2502  Progress: 2142 on 2502  Progress: 2143 on 2502  Progress: 2144 on 2502  Progress: 2145 on 2502  Progress: 2146 on 2502  Progress: 2147 on 2502  Progress: 2148 on 2502  Progress: 2149 on 2502  Progress: 2150 on 2502  Progress: 2151 on 2502  Progress: 2152 on 2502  Progress: 2153 on 2502  Progress: 2154 on 2502  Progress: 2155 on 2502  Progress: 2156 on 2502  Progress: 2157 on 2502  Progress: 2158 on 2502  Progress: 2159 on 2502  Progress: 2160 on 2502  Progress: 2161 on 2502  Progress: 2162 on 2502  Progress: 2163 on 2502  Progress: 2164 on 2502  Progress: 2165 on 2502  Progress: 2166 on 2502  Progress: 2167 on 2502  Progress: 2168 on 2502  Progress: 2169 on 2502  Progress: 2170 on 2502  Progress: 2171 on 2502  Progress: 2172 on 2502  Progress: 2173 on 2502  Progress: 2174 on 2502  Progress: 2175 on 2502  Progress: 2176 on 2502  Progress: 2177 on 2502  Progress: 2178 on 2502  Progress: 2179 on 2502  Progress: 2180 on 2502  Progress: 2181 on 2502  Progress: 2182 on 2502  Progress: 2183 on 2502  Progress: 2184 on 2502  Progress: 2185 on 2502  Progress: 2186 on 2502  Progress: 2187 on 2502  Progress: 2188 on 2502  Progress: 2189 on 2502  Progress: 2190 on 2502  Progress: 2191 on 2502  Progress: 2192 on 2502  Progress: 2193 on 2502  Progress: 2194 on 2502  Progress: 2195 on 2502  Progress: 2196 on 2502  Progress: 2197 on 2502  Progress: 2198 on 2502  Progress: 2199 on 2502  Progress: 2200 on 2502  Progress: 2201 on 2502  Progress: 2202 on 2502  Progress: 2203 on 2502  Progress: 2204 on 2502  Progress: 2205 on 2502  Progress: 2206 on 2502  Progress: 2207 on 2502  Progress: 2208 on 2502  Progress: 2209 on 2502  Progress: 2210 on 2502  Progress: 2211 on 2502  Progress: 2212 on 2502  Progress: 2213 on 2502  Progress: 2214 on 2502  Progress: 2215 on 2502  Progress: 2216 on 2502  Progress: 2217 on 2502  Progress: 2218 on 2502  Progress: 2219 on 2502  Progress: 2220 on 2502  Progress: 2221 on 2502  Progress: 2222 on 2502  Progress: 2223 on 2502  Progress: 2224 on 2502  Progress: 2225 on 2502  Progress: 2226 on 2502  Progress: 2227 on 2502  Progress: 2228 on 2502  Progress: 2229 on 2502  Progress: 2230 on 2502  Progress: 2231 on 2502  Progress: 2232 on 2502  Progress: 2233 on 2502  Progress: 2234 on 2502  Progress: 2235 on 2502  Progress: 2236 on 2502  Progress: 2237 on 2502  Progress: 2238 on 2502  Progress: 2239 on 2502  Progress: 2240 on 2502  Progress: 2241 on 2502  Progress: 2242 on 2502  Progress: 2243 on 2502  Progress: 2244 on 2502  Progress: 2245 on 2502  Progress: 2246 on 2502  Progress: 2247 on 2502  Progress: 2248 on 2502  Progress: 2249 on 2502  Progress: 2250 on 2502  Progress: 2251 on 2502  Progress: 2252 on 2502  Progress: 2253 on 2502  Progress: 2254 on 2502  Progress: 2255 on 2502  Progress: 2256 on 2502  Progress: 2257 on 2502  Progress: 2258 on 2502  Progress: 2259 on 2502  Progress: 2260 on 2502  Progress: 2261 on 2502  Progress: 2262 on 2502  Progress: 2263 on 2502  Progress: 2264 on 2502  Progress: 2265 on 2502  Progress: 2266 on 2502  Progress: 2267 on 2502  Progress: 2268 on 2502  Progress: 2269 on 2502  Progress: 2270 on 2502  Progress: 2271 on 2502  Progress: 2272 on 2502  Progress: 2273 on 2502  Progress: 2274 on 2502  Progress: 2275 on 2502  Progress: 2276 on 2502  Progress: 2277 on 2502  Progress: 2278 on 2502  Progress: 2279 on 2502  Progress: 2280 on 2502  Progress: 2281 on 2502  Progress: 2282 on 2502  Progress: 2283 on 2502  Progress: 2284 on 2502  Progress: 2285 on 2502  Progress: 2286 on 2502  Progress: 2287 on 2502  Progress: 2288 on 2502  Progress: 2289 on 2502  Progress: 2290 on 2502  Progress: 2291 on 2502  Progress: 2292 on 2502  Progress: 2293 on 2502  Progress: 2294 on 2502  Progress: 2295 on 2502  Progress: 2296 on 2502  Progress: 2297 on 2502  Progress: 2298 on 2502  Progress: 2299 on 2502  Progress: 2300 on 2502  Progress: 2301 on 2502  Progress: 2302 on 2502  Progress: 2303 on 2502  Progress: 2304 on 2502  Progress: 2305 on 2502  Progress: 2306 on 2502  Progress: 2307 on 2502  Progress: 2308 on 2502  Progress: 2309 on 2502  Progress: 2310 on 2502  Progress: 2311 on 2502  Progress: 2312 on 2502  Progress: 2313 on 2502  Progress: 2314 on 2502  Progress: 2315 on 2502  Progress: 2316 on 2502  Progress: 2317 on 2502  Progress: 2318 on 2502  Progress: 2319 on 2502  Progress: 2320 on 2502  Progress: 2321 on 2502  Progress: 2322 on 2502  Progress: 2323 on 2502  Progress: 2324 on 2502  Progress: 2325 on 2502  Progress: 2326 on 2502  Progress: 2327 on 2502  Progress: 2328 on 2502  Progress: 2329 on 2502  Progress: 2330 on 2502  Progress: 2331 on 2502  Progress: 2332 on 2502  Progress: 2333 on 2502  Progress: 2334 on 2502  Progress: 2335 on 2502  Progress: 2336 on 2502  Progress: 2337 on 2502  Progress: 2338 on 2502  Progress: 2339 on 2502  Progress: 2340 on 2502  Progress: 2341 on 2502  Progress: 2342 on 2502  Progress: 2343 on 2502  Progress: 2344 on 2502  Progress: 2345 on 2502  Progress: 2346 on 2502  Progress: 2347 on 2502  Progress: 2348 on 2502  Progress: 2349 on 2502  Progress: 2350 on 2502  Progress: 2351 on 2502  Progress: 2352 on 2502  Progress: 2353 on 2502  Progress: 2354 on 2502  Progress: 2355 on 2502  Progress: 2356 on 2502  Progress: 2357 on 2502  Progress: 2358 on 2502  Progress: 2359 on 2502  Progress: 2360 on 2502  Progress: 2361 on 2502  Progress: 2362 on 2502  Progress: 2363 on 2502  Progress: 2364 on 2502  Progress: 2365 on 2502  Progress: 2366 on 2502  Progress: 2367 on 2502  Progress: 2368 on 2502  Progress: 2369 on 2502  Progress: 2370 on 2502  Progress: 2371 on 2502  Progress: 2372 on 2502  Progress: 2373 on 2502  Progress: 2374 on 2502  Progress: 2375 on 2502  Progress: 2376 on 2502  Progress: 2377 on 2502  Progress: 2378 on 2502  Progress: 2379 on 2502  Progress: 2380 on 2502  Progress: 2381 on 2502  Progress: 2382 on 2502  Progress: 2383 on 2502  Progress: 2384 on 2502  Progress: 2385 on 2502  Progress: 2386 on 2502  Progress: 2387 on 2502  Progress: 2388 on 2502  Progress: 2389 on 2502  Progress: 2390 on 2502  Progress: 2391 on 2502  Progress: 2392 on 2502  Progress: 2393 on 2502  Progress: 2394 on 2502  Progress: 2395 on 2502  Progress: 2396 on 2502  Progress: 2397 on 2502  Progress: 2398 on 2502  Progress: 2399 on 2502  Progress: 2400 on 2502  Progress: 2401 on 2502  Progress: 2402 on 2502  Progress: 2403 on 2502  Progress: 2404 on 2502  Progress: 2405 on 2502  Progress: 2406 on 2502  Progress: 2407 on 2502  Progress: 2408 on 2502  Progress: 2409 on 2502  Progress: 2410 on 2502  Progress: 2411 on 2502  Progress: 2412 on 2502  Progress: 2413 on 2502  Progress: 2414 on 2502  Progress: 2415 on 2502  Progress: 2416 on 2502  Progress: 2417 on 2502  Progress: 2418 on 2502  Progress: 2419 on 2502  Progress: 2420 on 2502  Progress: 2421 on 2502  Progress: 2422 on 2502  Progress: 2423 on 2502  Progress: 2424 on 2502  Progress: 2425 on 2502  Progress: 2426 on 2502  Progress: 2427 on 2502  Progress: 2428 on 2502  Progress: 2429 on 2502  Progress: 2430 on 2502  Progress: 2431 on 2502  Progress: 2432 on 2502  Progress: 2433 on 2502  Progress: 2434 on 2502  Progress: 2435 on 2502  Progress: 2436 on 2502  Progress: 2437 on 2502  Progress: 2438 on 2502  Progress: 2439 on 2502  Progress: 2440 on 2502  Progress: 2441 on 2502  Progress: 2442 on 2502  Progress: 2443 on 2502  Progress: 2444 on 2502  Progress: 2445 on 2502  Progress: 2446 on 2502  Progress: 2447 on 2502  Progress: 2448 on 2502  Progress: 2449 on 2502  Progress: 2450 on 2502  Progress: 2451 on 2502  Progress: 2452 on 2502  Progress: 2453 on 2502  Progress: 2454 on 2502  Progress: 2455 on 2502  Progress: 2456 on 2502  Progress: 2457 on 2502  Progress: 2458 on 2502  Progress: 2459 on 2502  Progress: 2460 on 2502  Progress: 2461 on 2502  Progress: 2462 on 2502  Progress: 2463 on 2502  Progress: 2464 on 2502  Progress: 2465 on 2502  Progress: 2466 on 2502  Progress: 2467 on 2502  Progress: 2468 on 2502  Progress: 2469 on 2502  Progress: 2470 on 2502  Progress: 2471 on 2502  Progress: 2472 on 2502  Progress: 2473 on 2502  Progress: 2474 on 2502  Progress: 2475 on 2502  Progress: 2476 on 2502  Progress: 2477 on 2502  Progress: 2478 on 2502  Progress: 2479 on 2502  Progress: 2480 on 2502  Progress: 2481 on 2502  Progress: 2482 on 2502  Progress: 2483 on 2502  Progress: 2484 on 2502  Progress: 2485 on 2502  Progress: 2486 on 2502  Progress: 2487 on 2502  Progress: 2488 on 2502  Progress: 2489 on 2502  Progress: 2490 on 2502  Progress: 2491 on 2502  Progress: 2492 on 2502  Progress: 2493 on 2502  Progress: 2494 on 2502  Progress: 2495 on 2502  Progress: 2496 on 2502  Progress: 2497 on 2502  Progress: 2498 on 2502  Progress: 2499 on 2502  Progress: 2500 on 2502  Progress: 2501 on 2502  Progress: 2502 on 2502  
za_instytucja <- za_instytucja %>%
  filter(is.na(czy_nazwisko)&is.na(czy_imie)) %>%
  filter(instytucja!="") %>%
  filter(!grepl("^\\[[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]|^[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]",instytucja)) %>%
  mutate(instytucja = str_remove(instytucja,"\\.$")) %>%
  select(ZA_UWAGI,instytucja) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#10: wydawnictwo
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI, X260) %>%
  mutate(X260 = str_replace_all(X260,"s\\.n\\.", "b.w."), 
         X260 = str_replace_all(X260,"s\\.l\\.", "b.m."), 
         X260 = str_replace_all(X260,"S\\.l\\.", "b.m."), 
         X260 = str_remove(X260,"^\\\\+"), 
         rok_wydania = str_extract_all(X260, "(?<=\\$c).*(?=\\$e)|(?<=\\$c).*"), 
         bez_roku = str_replace_all(X260, ".\\$c.*", ""), 
         ile_wydawnictw = str_count(bez_roku, "\\$b"),
         ile_miejsc = str_count(bez_roku, "\\$a"),
         kolejnosc = str_replace_all(as.character(str_extract_all(bez_roku, "\\$.")), "[^a-z]", ""),
         bez_roku = str_replace_all(bez_roku, ";\\$b", ":$b"),
         wydaw_podziel = ifelse(ile_wydawnictw>ile_miejsc|kolejnosc=="caabb", str_replace_all(bez_roku, "(\\$a)(.*?)( :\\$b.*?)( :\\$b)", "\\1\\2\\3 ;$a\\2\\4"),bez_roku),
         wydawnictwo_test = str_replace_all(wydaw_podziel, "(\\$b)(.*?)( ;\\$a)", "\\1\\2|\\3")) %>%
  select(ZA_UWAGI,rok_wydania,wydawnictwo_test) %>%
  cSplit(., "wydawnictwo_test", sep = "|", direction = "long") %>%
  mutate(wydawnictwo = str_extract_all(wydawnictwo_test, "(?<=\\$b)(.*)"),
         miejsce_wydania = str_replace_all(str_extract_all(wydawnictwo_test, "(?<=\\$a)(.*)(?= {0,1}: {0,1}\\$b)|(?<=\\$a)(.*)($)")," ;\\$a", ", "),
         nazwa_prosta = str_to_lower(str_replace_all(str_replace_all(unlist(wydawnictwo_test), "\\$\\w", ""), "\\W", ""))) %>%
  left_join(.,PBL_wydawnictwa,by="nazwa_prosta") %>%
  mutate(to_samo = wydawnictwo==WY_NAZWA) %>%
  arrange(ZA_UWAGI,-to_samo,-WY_LICZBA_ZAPISOW)
argument is not an atomic vector; coercing
BN_wydawnictwo$id_grupy <- cumsum(!duplicated(BN_wydawnictwo[1:3]))
BN_wydawnictwo <- BN_wydawnictwo[!duplicated(BN_wydawnictwo$id_grupy),] %>%
  mutate(WY_NAZWA = ifelse(!is.na(WY_NAZWA),as.character(WY_NAZWA),as.character(wydawnictwo)),
         WY_MIASTO = ifelse(!is.na(WY_MIASTO),as.character(WY_MIASTO),trim(as.character(miejsce_wydania))),
         rok_wydania = str_replace_all(rok_wydania, "(.*)(\\.)", "\\1"),
         za_rok_wydania = ifelse(nchar(rok_wydania)==4,as.character(rok_wydania),NA),
         do_opisu = ifelse(is.na(za_rok_wydania),paste("[",str_extract(rok_wydania,"\\d{4}"),"]",sep = ""),""),
         WY_MIASTO = ifelse(substr(WY_MIASTO,1,1)=="["&substr(WY_MIASTO,nchar(WY_MIASTO),nchar(WY_MIASTO))!="]"&is.na(WY_WYDAWNICTWO_ID),paste(trim(WY_MIASTO),"]",sep = ""),as.character(WY_MIASTO))) %>%
  select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania,do_opisu) %>% 
  mutate(WY_NAZWA = ifelse(str_count(WY_NAZWA, "\\[")>str_count(WY_NAZWA, "\\]"), paste(WY_NAZWA, "]", sep = ""),
                           ifelse(str_count(WY_NAZWA, "\\[")<str_count(WY_NAZWA, "\\]"), paste("[", WY_NAZWA, sep = ""), as.character(WY_NAZWA))),
         WY_MIASTO = ifelse(str_count(WY_MIASTO, "\\[")>str_count(WY_MIASTO, "\\]"), paste(WY_MIASTO, "]", sep = ""),
                           ifelse(str_count(WY_MIASTO, "\\[")<str_count(WY_MIASTO, "\\]"), paste("[", WY_MIASTO, sep = ""), as.character(WY_MIASTO))))

#11: opis fizyczny książki
#pole 300 do opisu fizycznego
marc_field_300 <- data %>%
  select(ZA_UWAGI,X300)%>%
  filter(X300!="") %>%
  mutate(X300=str_replace_all(X300,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X300",sep = "~",direction = "long") %>%
  filter(X300!="") %>%
  mutate(X300=str_remove_all(X300,"^\\|")) %>%
  mutate(indicator = str_replace_all(X300,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X300,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_300)[1]))
colnames(empty_table) <-subfield_list
marc_field_300<-cbind(marc_field_300,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_300$X300 <- str_replace(marc_field_300$X300,subfield_list_char[i],"|\\1")
}
Progress: 1 on 4  Progress: 2 on 4  Progress: 3 on 4  Progress: 4 on 4  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_300[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_300$X300),str_replace_all(gsub(string,"\\3",marc_field_300$X300),"\\${2}.", "~"),NA)
}
Progress: 1 on 4  Progress: 2 on 4  Progress: 3 on 4  Progress: 4 on 4  
marc_field_300 <- marc_field_300 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$b` = str_remove(`$b`," \\;+$| \\:+$"),
         `$e` = ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`)&grepl("\\+ dysk|płyt",`$e`),str_extract(`$e`,"(?<=\\+)(dysk|płyt.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),
                       ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`),str_extract(`$e`,"(^.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),NA)),
         `$a` = ifelse(is.na(`$a`),"",as.character(`$a`)),
         `$b` = ifelse(is.na(`$b`),"",as.character(`$b`)),
         `$e` = ifelse(is.na(`$e`),"",as.character(`$e`)))
#pole 500 do opisu fizycznego
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
marc_field_500 <- marc_field_500 %>%
  mutate(`$a` = ifelse(grepl("oryg(\\.|\\,)",X500)&grepl("pseud|nazwa",X500,ignore.case = TRUE),str_replace(`$a`,"(^.*?)(\\. )(\\p{Lu}.*$)","\\3"),as.character(`$a`))) %>% 
  filter(!grepl("oryg(\\.|\\,)",`$a`)&grepl("pseud|nazwa|dotycz|pol",`$a`,ignore.case = TRUE)) %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))

#pole 546 do opisu fizycznego
marc_field_546 <- data %>%
  select(ZA_UWAGI,X546)%>%
  filter(X546!="") %>%
  mutate(X546=str_replace_all(X546,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X546",sep = "~",direction = "long") %>%
  filter(X546!="") %>%
  mutate(X546=str_remove_all(X546,"^\\|")) %>%
  mutate(indicator = str_replace_all(X546,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X546,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_546)[1]))
colnames(empty_table) <-subfield_list
marc_field_546<-cbind(marc_field_546,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_546$X546 <- str_replace(marc_field_546$X546,subfield_list_char[i],"|\\1")
}
Progress: 1 on 2  Progress: 2 on 2  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_546[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_546$X546),str_replace_all(gsub(string,"\\3",marc_field_546$X546),"\\${2}.", "~"),NA)
}
Progress: 1 on 2  Progress: 2 on 2  
marc_field_546 <- marc_field_546 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))

#pole 501 do opisu fizycznego
marc_field_501 <- data %>%
  select(ZA_UWAGI,X501)%>%
  filter(X501!="") %>%
  mutate(X501=str_replace_all(X501,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X501",sep = "~",direction = "long") %>%
  filter(X501!="") %>%
  mutate(X501=str_remove_all(X501,"^\\|")) %>%
  mutate(indicator = str_replace_all(X501,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X501,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_501)[1]))
colnames(empty_table) <-subfield_list
marc_field_501<-cbind(marc_field_501,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_501$X501 <- str_replace(marc_field_501$X501,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_501[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_501$X501),str_replace_all(gsub(string,"\\3",marc_field_501$X501),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
marc_field_501 <- marc_field_501 %>%
  select(ZA_UWAGI, `$a`)

za_opis_ks <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,do_opisu),by="ZA_UWAGI") %>%
  left_join(.,marc_field_300 %>% select(ZA_UWAGI,X300a=`$a`,X300b=`$b`,X300e=`$e`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_500 %>% select(ZA_UWAGI,X500a=`$a`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_546 %>% select(ZA_UWAGI,X546a=`$a`),by="ZA_UWAGI") %>% 
  left_join(.,marc_field_501 %>% select(ZA_UWAGI,X501a=`$a`),by="ZA_UWAGI")
za_opis_ks[is.na(za_opis_ks)]  <- ""
za_opis_ks <- za_opis_ks %>%
  mutate(za_opis_ks = paste(ifelse(do_opisu!="",paste(as.character(do_opisu),", ",sep = ""),""),ifelse(X300a!="",paste(as.character(X300a),", ",sep = ""),""),ifelse(X300b!="",paste(as.character(X300b),", ",sep = ""),""),ifelse(X300e!="",paste(as.character(X300e),", ",sep = ""),""),ifelse(X500a!="",paste(as.character(X500a),", ",sep = ""),""),ifelse(X546a!="",as.character(X546a),""),ifelse(X501a!="",as.character(X501a),""),sep = ""),
         za_opis_ks = str_remove(za_opis_ks,"(, )+$")) %>%
  select(ZA_UWAGI,za_opis_ks) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(za_opis_ks))
za_opis_ks$id_grupy <- cumsum(!duplicated(za_opis_ks[1]))
za_opis_ks <- za_opis_ks[!duplicated(za_opis_ks$id_grupy),] %>%
  select(-id_grupy)

#12: seria wydawnicza
marc_field_490 <- data %>%
  select(ZA_UWAGI,X490,X800,X830) %>%
  mutate(X490 = ifelse(grepl("U\\+",X490),as.character(X830),as.character(X490))) %>%
  mutate(X800 = ifelse(X490!="","",as.character(X800)),
         X830 = ifelse(X490!="","",as.character(X830)),
         X800 = str_replace(X800,"(\\$a)(.*)(\\$t)","\\1"),
         X490 = ifelse(X490==""&X830!="",as.character(X830),
                       ifelse(X490==""&X800!="",as.character(X800),as.character(X490)))) %>%
  select(ZA_UWAGI,X490) %>%
  filter(X490!="") %>%
  mutate(X490=str_replace_all(X490,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X490",sep = "~",direction = "long") %>%
  filter(X490!="") %>%
  mutate(X490=str_remove_all(X490,"^\\|")) %>%
  mutate(indicator = str_replace_all(X490,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X490,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_490)[1]))
colnames(empty_table) <-subfield_list
marc_field_490<-cbind(marc_field_490,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_490$X490 <- str_replace(marc_field_490$X490,subfield_list_char[i],"|\\1")
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_490[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_490$X490),str_replace_all(gsub(string,"\\3",marc_field_490$X490),"\\${2}.", "~"),NA)
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
za_seria_wydawnicza <- marc_field_490 %>%
  mutate(`$a` = str_replace_all(`$a`,"(=)(\\$a)","\\1 "),
         `$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$v` = ifelse(is.na(`$v`),"",as.character(`$v`))) %>%
  filter(!is.na(`$a`)) %>%
  mutate(seria = str_remove(paste("(",`$a`,"; ",`$v`,")",sep = ""),"; (?=\\)$)"),
         seria = gsub("( : )(.)",". \\U\\2",perl=TRUE,seria)) %>%
  select(ZA_UWAGI,seria) %>%
  group_by(ZA_UWAGI) %>%
  mutate(seria = paste(seria,collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(seria = str_replace_all(seria,"\\$.","; ")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#13: tomy
za_tomy <- data %>%
  select(ZA_UWAGI) %>%
  mutate(za_tomy = NA)

#14: adnotacje
za_adnotacje <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_autor %>% select(ZA_UWAGI,ZA_ADNOTACJE),by="ZA_UWAGI") %>%
  left_join(.,BN_wspoltworca %>% select(ZA_UWAGI,ZA_ADNOTACJE),by="ZA_UWAGI") %>%
  mutate(ZA_ADNOTACJE = paste(ifelse(is.na(ZA_ADNOTACJE.x),"",paste(as.character(ZA_ADNOTACJE.x),"# ",sep = "")),ifelse(is.na(ZA_ADNOTACJE.y),"",as.character(ZA_ADNOTACJE.y)),sep = ""),
         ZA_ADNOTACJE = str_remove(ZA_ADNOTACJE,"(# )+$")) %>%
  select(ZA_UWAGI,ZA_ADNOTACJE) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(ZA_ADNOTACJE))
za_adnotacje$id_grupy <- cumsum(!duplicated(za_adnotacje[1]))
za_adnotacje <- za_adnotacje[!duplicated(za_adnotacje$id_grupy),] %>%
  select(-id_grupy)

#15: BN_URL
BN_URL <- data %>%
  select(ZA_UWAGI,BN_URL)

#wyrównanie liczby wierszy do liczby wierszy obiektu data
BN_autor <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_autor %>% select(ZA_UWAGI,AM_AUTOR_ID,AM_NAZWISKO,AM_IMIE),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, AM_AUTOR_ID = paste(AM_AUTOR_ID, collapse="|"), AM_NAZWISKO = paste(AM_NAZWISKO, collapse="|"), AM_IMIE = paste(AM_IMIE, collapse="|"))
BN_wspoltworca <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wspoltworca %>% select(ZA_UWAGI,OS_OSOBA_ID,OS_NAZWISKO,OS_IMIE,fo_symbol),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, OS_OSOBA_ID = paste(OS_OSOBA_ID, collapse="|"), OS_NAZWISKO = paste(OS_NAZWISKO, collapse="|"), OS_IMIE = paste(OS_IMIE, collapse="|"), fo_symbol = paste(fo_symbol, collapse="|")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL","NA",as.character(fo_symbol)))
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, WY_WYDAWNICTWO_ID = paste(WY_WYDAWNICTWO_ID, collapse="|"), WY_NAZWA = paste(WY_NAZWA, collapse="|"), WY_MIASTO = paste(WY_MIASTO, collapse="|"), za_rok_wydania = paste(unique(za_rok_wydania), collapse="|")) %>%
  mutate(za_rok_wydania = ifelse(za_rok_wydania=="NA","",as.integer(za_rok_wydania)))
pojawi戼㸳y si攼㹡 warto㤼㹣ci NA na skutek przekszta戼㸳cenia
#połączenie wszystkich elementów w jedną tabelę
kolejnosc <- data.frame(kolejnosc=c("ZA_UWAGI","RZ_NAZWA","ZA_RO_ROK","ZA_TYPE","RZ_RODZAJ_ID","DZ_NAZWA","DZ_DZIAL_ID","TW_TWORCA_ID","AM_AUTOR_ID","AM_NAZWISKO","AM_IMIE","ZA_TYTUL","ZA_TYTUL_ORYGINALU","ZA_JEZYK_ORYGINALU","OS_OSOBA_ID","OS_NAZWISKO","OS_IMIE","fo_symbol","za_opis_wspoltworcow","wydanie","za_tomy","instytucja","WY_WYDAWNICTWO_ID","WY_MIASTO","WY_NAZWA","za_rok_wydania","za_opis_ks","seria","TW_NAZWISKO","TW_IMIE","redaktor_dzialu","ZA_ADNOTACJE","BN_URL"))
polaczone <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,pola_pbl,by = "ZA_UWAGI") %>%
  left_join(.,BN_autor,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,za_jezyk_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,BN_wspoltworca,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_wspoltworcow,by = "ZA_UWAGI") %>%
  left_join(.,za_wydanie,by = "ZA_UWAGI") %>%
  left_join(.,za_instytucja,by = "ZA_UWAGI") %>%
  left_join(.,BN_wydawnictwo,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_ks,by = "ZA_UWAGI") %>%
  left_join(.,za_seria_wydawnicza,by = "ZA_UWAGI") %>%
  left_join(.,za_tomy,by = "ZA_UWAGI") %>%
  left_join(.,za_adnotacje,by = "ZA_UWAGI") %>%
  left_join(.,BN_URL,by = "ZA_UWAGI") %>%
  select(as.vector(kolejnosc$kolejnosc))
colnames(polaczone) <- c("rekord_BN","rz_nazwa","za_ro_rok","za_type","rz_rodzaj_id","DZ_NAZWA","DZ_DZIAL_ID","tw_tworca_id","am_autor_id","am_nazwisko","am_imie","za_tytul","za_tytul_oryginalu","za_jezyk_oryginalu","os_osoba_id","os_nazwisko","os_imie","fo_symbol","za_opis_wspoltworcow","za_wydanie","za_tomy","za_instytucja","wy_wydawnictwo_id","wy_miejsce","wy_nazwa","za_rok_wydania","za_opis_fizyczny_ksiazki","za_seria_wydawnicza","tw_nazwisko","tw_imie","pracownik","za_adnotacje","BN_URL")

#zasygnalizowanie niepoprawnego kodowania
x <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("<U\\+(....)>",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)!=0,paste(polaczone$za_adnotacje,paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole",sep = ""),sep = "# "),paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole",sep = "")),as.character(polaczone$za_adnotacje))
  polaczone[,i] <- gsub("<U\\+(....)>", "???", polaczone[,i])
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności znaku $ w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("\\$",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności frazy "character(0)" w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("character\\(0\\)",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności znaku # w opisie współtwórców
polaczone$za_adnotacje <- ifelse(grepl("\\#",polaczone$za_opis_wspoltworcow),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności \"#\" współtwórcy z pola 700)",paste(polaczone$za_adnotacje,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności # współtwórcy z pola 700)",sep = "# ")),as.character(polaczone$za_adnotacje))

out <- cSplit(polaczone, c("am_autor_id", "am_nazwisko", "am_imie","os_osoba_id","os_nazwisko", "os_imie", "fo_symbol","wy_wydawnictwo_id","wy_miejsce","wy_nazwa"),sep = "|",direction = "long") %>%
  unique()

out$rekord_BN <- ifelse(is.na(out$rekord_BN),'',as.character(out$rekord_BN))
out$rz_nazwa <- ifelse(is.na(out$rz_nazwa),'',as.character(out$rz_nazwa))
out$za_ro_rok <- ifelse(is.na(out$za_ro_rok),'',as.character(out$za_ro_rok))
out$za_type <- ifelse(is.na(out$za_type),'',as.character(out$za_type))
out$rz_rodzaj_id <- ifelse(is.na(out$rz_rodzaj_id),'',as.character(out$rz_rodzaj_id))
out$DZ_NAZWA <- ifelse(is.na(out$DZ_NAZWA),'',as.character(out$DZ_NAZWA))
out$DZ_DZIAL_ID <- ifelse(is.na(out$DZ_DZIAL_ID),'',as.character(out$DZ_DZIAL_ID))
out$tw_tworca_id <- ifelse(is.na(out$tw_tworca_id),'',as.character(out$tw_tworca_id))
out$am_autor_id <- ifelse(is.na(out$am_autor_id),'',as.character(out$am_autor_id))
out$am_nazwisko <- ifelse(is.na(out$am_nazwisko),'',as.character(out$am_nazwisko))
out$am_imie <- ifelse(is.na(out$am_imie),'',as.character(out$am_imie))
out$za_tytul <- ifelse(is.na(out$za_tytul),'',as.character(out$za_tytul))
out$za_tytul_oryginalu <- ifelse(is.na(out$za_tytul_oryginalu),'',as.character(out$za_tytul_oryginalu))
out$za_jezyk_oryginalu <- ifelse(is.na(out$za_jezyk_oryginalu),'',as.character(out$za_jezyk_oryginalu))
out$os_osoba_id <- ifelse(is.na(out$os_osoba_id),'',as.character(out$os_osoba_id))
out$os_nazwisko <- ifelse(is.na(out$os_nazwisko),'',as.character(out$os_nazwisko))
out$os_imie <- ifelse(is.na(out$os_imie),'',as.character(out$os_imie))
out$fo_symbol <- ifelse(is.na(out$fo_symbol),'',as.character(out$fo_symbol))
out$za_opis_wspoltworcow <- ifelse(is.na(out$za_opis_wspoltworcow),'',as.character(out$za_opis_wspoltworcow))
out$za_wydanie <- ifelse(is.na(out$za_wydanie),'',as.character(out$za_wydanie))
out$za_tomy <- ifelse(is.na(out$za_tomy),'',as.character(out$za_tomy))
out$za_instytucja <- ifelse(is.na(out$za_instytucja),'',as.character(out$za_instytucja))
out$wy_wydawnictwo_id <- ifelse(is.na(out$wy_wydawnictwo_id),'',as.character(out$wy_wydawnictwo_id))
out$wy_miejsce <- ifelse(is.na(out$wy_miejsce),'',as.character(out$wy_miejsce))
out$wy_nazwa <- ifelse(is.na(out$wy_nazwa),'',as.character(out$wy_nazwa))
out$za_rok_wydania <- ifelse(is.na(out$za_rok_wydania),'',as.character(out$za_rok_wydania))
out$za_opis_fizyczny_ksiazki <- ifelse(is.na(out$za_opis_fizyczny_ksiazki),'',as.character(out$za_opis_fizyczny_ksiazki))
out$za_seria_wydawnicza <- ifelse(is.na(out$za_seria_wydawnicza),'',as.character(out$za_seria_wydawnicza))
out$tw_nazwisko <- ifelse(is.na(out$tw_nazwisko),'',as.character(out$tw_nazwisko))
out$tw_imie <- ifelse(is.na(out$tw_imie),'',as.character(out$tw_imie))
out$pracownik <- ifelse(is.na(out$pracownik),'',as.character(out$pracownik))
out$za_adnotacje <- ifelse(is.na(out$za_adnotacje),'',as.character(out$za_adnotacje))
out$BN_URL <- ifelse(is.na(out$BN_URL),'',as.character(out$BN_URL))

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same
out$same[1] <- 0
out$dzielone <- paste(out$am_autor_id,out$am_nazwisko,out$am_imie,out$os_osoba_id,out$os_nazwisko,out$os_imie,out$fo_symbol,out$wy_wydawnictwo_id,out$wy_miejsce,out$wy_nazwa,sep = "")

out <- out %>%
  filter(!(same==1&dzielone=="")) %>%
  select(1:33)

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same

#ucięcie zbyt długich ciągów znaków, by weszły do oracle'a
dlugosci <- data.frame(pole = c("am_nazwisko", "am_imie", "za_tytul", "za_tytul_oryginalu", "za_jezyk_oryginalu", "os_nazwisko", "os_imie", "za_opis_wspoltworcow", "za_instytucja", "wy_miejsce", "wy_nazwa", "za_opis_fizyczny_ksiazki", "za_seria_wydawnicza", "tw_nazwisko", "tw_imie", "za_adnotacje"), liczba_znakow = c(50,40,500,500,100,50,40,500,255,40,255,1000,255,200,40,2000))
x <- match(dlugosci$pole,names(out))
for (i in x) {
  progress(match(i,x), max.value = length(x))
  dlugosc <- dlugosci$liczba_znakow[match(names(out[i]),dlugosci$pole)]
  out$za_adnotacje <- ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje!="",paste(out$za_adnotacje,paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),sep = "# "),
                             ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje=="",paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),as.character(out$za_adnotacje)))
  
  out[,i] <- ifelse(dlugosc<nchar(as.character(out[,i])),as.character(substr(out[,i],1,dlugosc)),as.character(out[,i]))
}
Progress:  1 on 16  Progress:  2 on 16  Progress:  3 on 16  Progress:  4 on 16  Progress:  5 on 16  Progress:  6 on 16  Progress:  7 on 16  Progress:  8 on 16  Progress:  9 on 16  Progress: 10 on 16  Progress: 11 on 16  Progress: 12 on 16  Progress: 13 on 16  Progress: 14 on 16  Progress: 15 on 16  Progress: 16 on 16  
out$rekord_BN[out$same == 1] <- ""
out$rz_nazwa[out$same == 1] <- ""
out$za_ro_rok[out$same == 1] <- ""
out$za_type[out$same == 1] <- ""
out$rz_rodzaj_id[out$same == 1] <- ""
out$DZ_NAZWA[out$same == 1] <- ""
out$DZ_DZIAL_ID[out$same == 1] <- ""
out$tw_tworca_id[out$same == 1] <- ""
out$za_tytul[out$same == 1] <- ""
out$za_tytul_oryginalu[out$same == 1] <- ""
out$za_jezyk_oryginalu[out$same == 1] <- ""
out$za_opis_wspoltworcow[out$same == 1] <- ""
out$za_wydanie[out$same == 1] <- ""
out$za_tomy[out$same == 1] <- ""
out$za_instytucja[out$same == 1] <- ""
out$za_rok_wydania[out$same == 1] <- ""
out$za_opis_fizyczny_ksiazki[out$same == 1] <- ""
out$za_seria_wydawnicza[out$same == 1] <- ""
out$tw_nazwisko[out$same == 1] <- ""
out$tw_imie[out$same == 1] <- ""
out$pracownik[out$same == 1] <- ""
out$za_adnotacje[out$same == 1] <- ""
out$BN_URL[out$same == 1] <- ""

out <- out %>%
  select(1:33)

#pętla zapisująca po ok. 2000 wierszy z uwzględnieniem kompletności rekordów bibliograficznych rozpisanych na kilka wierszy
out <- out %>%
  mutate(podzial = ifelse(rekord_BN!="",as.character(rekord_BN),NA)) %>%
  fill(podzial)
ile <- unique(out$podzial)
ile <- split(unique(ile), ceiling(seq_along(unique(ile))/1500))
x <- 1:length(ile)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  final <- out %>%
    filter(podzial %in% ile[[i]]) %>%
    select(-podzial)
  write.xlsx(final, paste("C:/Users/",employee_name,"/Desktop/",import_year,"_przedmiotowa_do_importu",i,".xlsx",sep = ""),sheetName = "gotowe")
}
Progress: 1 on 2  Progress: 2 on 2  
bn_ok <- chunk11
data <- bn_ok %>%
  filter(rodzaj_ksiazki=="antologia") %>%
  mutate(redaktor_dzialu = paste(redaktor_dzialu,"_ant",sep = ""))
#uwolnienie kolumn z danymi z bn i przetworzenie do PBL
#1: za_uwagi, rz_nazwa, za_ro_rok, za_type, rz_rodzaj_id, tw_tworca_id, tw_nazwisko, tw_imie, dz_dzial_id, dz_nazwa, redaktor_dzialu
pola_pbl <- data %>%
  select(ZA_UWAGI, RZ_NAZWA, ZA_RO_ROK = rok, RZ_RODZAJ_ID, TW_TWORCA_ID, TW_NAZWISKO, TW_IMIE, DZ_DZIAL_ID, DZ_NAZWA, redaktor_dzialu) %>%
  mutate(ZA_TYPE = "KS")
#2: autor
BN_autor <- data %>%
  select(ZA_UWAGI) %>%
  mutate(AM_AUTOR_ID = NA,
         AM_NAZWISKO = NA,
         AM_IMIE = NA)

#adnotacje z autorów
#w antologii adnotacja musi być wcześniej, żeby na górze było info o tekstach autorów

ZA_ADNOTACJE <- data %>%
  select(X100,X245,ZA_UWAGI)
#pole 100
marc_field_100 <- ZA_ADNOTACJE %>%
  select(ZA_UWAGI,X100)%>%
  filter(X100!="") %>%
  mutate(X100=str_replace_all(X100,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X100",sep = "~",direction = "long") %>%
  filter(X100!="") %>%
  mutate(X100=str_remove_all(X100,"^\\|")) %>%
  mutate(indicator = str_replace_all(X100,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(ZA_ADNOTACJE$X100,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_100)[1]))
colnames(empty_table) <-subfield_list
marc_field_100<-cbind(marc_field_100,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_100$X100 <- str_replace(marc_field_100$X100,subfield_list_char[i],"|\\1")
}
Progress: 1 on 4  Progress: 2 on 4  Progress: 3 on 4  Progress: 4 on 4  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_100[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_100$X100),str_replace_all(gsub(string,"\\3",marc_field_100$X100),"\\${2}.", "~"),NA)
}
Progress: 1 on 4  Progress: 2 on 4  Progress: 3 on 4  Progress: 4 on 4  
#tutaj może być błąd ze względu na brak kolumny $b, wtedy należy zmienić linię z selectem i zakomentować linię: mutate(`$a` = ifelse(!is.na(`$b`),paste(`$a`,`$b`,sep = " "),as.character(`$a`))) %>%
ZA_ADNOTACJE <- marc_field_100 %>%
  #select(ZA_UWAGI,`$a`,`$b`) %>%
  select(ZA_UWAGI,`$a`) %>%
  unique() %>%
  #mutate(`$a` = ifelse(!is.na(`$b`),paste(`$a`,`$b`,sep = " "),as.character(`$a`))) %>%
  mutate(`$a` = str_remove(`$a`,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)")) %>%
  unique() %>%
  mutate(AM_NAZWISKO = ifelse(grepl("\\|",`$a`), str_replace_all(str_remove_all(`$a`,","),"\\|",", "),
                              ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\1"),as.character(`$a`))),
         AM_IMIE = ifelse(grepl("\\|",`$a`),"*",
                          ifelse(grepl(",",`$a`),str_replace_all(`$a`,"(.*?)(, )(.*)","\\3"),"*"))) %>%
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE) %>%
  unite("ZA_ADNOTACJE", AM_IMIE:AM_NAZWISKO, sep = " ") %>%
  group_by(ZA_UWAGI) %>%
  mutate(ZA_ADNOTACJE = paste("[Teksty aut.:]",paste(ZA_ADNOTACJE,collapse = ", "),sep = " ")) %>%
  ungroup() %>%
  unique() %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#3: tytuł
#pole 245
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
marc_field_245 <- marc_field_245 %>%
 select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
 group_by(ZA_UWAGI) %>%
 mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = " "),
        `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = " "),
        `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = " "),
        `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = " ")) %>%
 ungroup() %>%
 unique() %>%
 unite("ZA_TYTUL",`$a`:`$p`,sep = " ",na.rm = TRUE) %>%
 mutate(ZA_TYTUL = str_replace_all(ZA_TYTUL," +"," "),
        ZA_TYTUL = str_remove(ZA_TYTUL, "\\s+\\/\\s{0,}$"),
        ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                          ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                 ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                        ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
        ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                          ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                 ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                        ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
        ZA_TYTUL = str_replace_all(ZA_TYTUL,"\\.{3} \\.{3}","... "),
        ZA_TYTUL = str_replace_all(ZA_TYTUL," ; ",". "),
        ZA_TYTUL = gsub("( : )(.)",". \\U\\2",perl=TRUE,ZA_TYTUL)) %>%
 select(ZA_UWAGI,ZA_TYTUL)
#dopisanie gatunku do przedmiotowej na podstawie 655 i 650  
gatunki_pbl <- data.frame(gatunek = c("aforyzm", "album", "antologia", "autobiografia", "dziennik", "esej", "felieton", "inne", "kazanie", "list", "miniatura prozą", "opowiadanie", "poemat", "powieść", "proza", "proza poetycka", "reportaż", "rozmyślanie religijne", "rysunek, obraz", "scenariusz", "szkic", "tekst biblijny", "tekst dramatyczny", "dramat", "wiersz", "wspomnienia", "wypowiedź", "pamiętniki", "poezja", "literatura podróżnicza", "satyra", "piosenka"))

#dramat, pamiętniki, poezja, literatura podróżnicza, satyra, piosenka
gatunki_bn <- data %>%
  select(ZA_UWAGI,X655,X650)

gatunki_bn <- sqldf("select *
                    from gatunki_bn
                    left join gatunki_pbl on lower(gatunki_bn.X655) like '%'||gatunki_pbl.gatunek||'%'")
gatunki_bn <- sqldf("select *
                      from gatunki_bn
                      left join gatunki_pbl on lower(gatunki_bn.X650) like '%'||gatunki_pbl.gatunek||'%'")
colnames(gatunki_bn)[5] <- "gatunek2"
gatunki_bn <- gatunki_bn %>%
  mutate(gatunek = ifelse(is.na(gatunek)&!is.na(gatunek2),as.character(gatunek2),as.character(gatunek))) %>%
  filter(!is.na(gatunek)) %>%
  select(ZA_UWAGI,gatunek) %>%
  mutate(gatunek = ifelse(gatunek=="dramat","tekst dramatyczny",
                          ifelse(gatunek=="pamiętniki","wspomnienia",
                                 ifelse(gatunek=="poezja","wiersz",
                                        ifelse(gatunek=="literatura podróżnicza","reportaż",
                                               ifelse(gatunek=="piosenka","wiersz",as.character(gatunek))))))) %>%
  group_by(ZA_UWAGI) %>%
  mutate(gatunek = paste(gatunek,collapse = ", ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(gatunek = gsub("(^.)","\\U\\1",perl = TRUE, gatunek))
#połączenie tytułu z gatunkiem
za_tytul <- marc_field_245 %>%
  left_join(.,gatunki_bn,by="ZA_UWAGI") %>% 
  mutate(gatunek = paste("[",gatunek,"]",sep = ""),
         gatunek = ifelse(gatunek=="[NA]",NA,as.character(gatunek))) %>% 
  unite("ZA_TYTUL", ZA_TYTUL:gatunek, sep = ". ",na.rm=TRUE) %>% 
  mutate(ZA_TYTUL = str_replace_all(ZA_TYTUL,"\\. \\.",". "),
         ZA_TYTUL = str_replace(ZA_TYTUL,"(\\!)(\\.)|(\\?)(\\.)","\\1"))
#4: tytuł oryginału
#pole 246
marc_field_246 <- data %>%
  select(ZA_UWAGI,X246)%>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"~"),
         X246=str_replace_all(X246,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X246",sep = "~",direction = "long") %>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"^\\|")) %>%
  mutate(indicator = str_replace_all(X246,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X246,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_246)[1]))
colnames(empty_table) <-subfield_list
marc_field_246<-cbind(marc_field_246,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_246$X246 <- str_replace(marc_field_246$X246,subfield_list_char[i],"|\\1")
}
Progress: 1 on 4  Progress: 2 on 4  Progress: 3 on 4  Progress: 4 on 4  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_246[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_246$X246),str_replace_all(gsub(string,"\\3",marc_field_246$X246),"\\${2}.", "~"),NA)
}
Progress: 1 on 4  Progress: 2 on 4  Progress: 3 on 4  Progress: 4 on 4  
if("$n" %in% colnames(marc_field_245)) {
marc_field_246 <- marc_field_246 %>%
 filter(grepl("oryg",X246)) %>%
 select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
 group_by(ZA_UWAGI) %>%
 mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = ", "),
        `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = ""),
        `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = ""),
        `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = "")) %>%
 ungroup() %>%
 unique() %>%
 unite("X246",`$a`:`$p`,sep = " ",na.rm = TRUE) %>%
 mutate(X246 = str_replace_all(X246," +"," "),
        X246 = str_remove(X246, "\\s+\\/\\s{0,}$"),
        X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                          ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                 ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                        ifelse(grepl("(\\W)( )(:|;)( )(.)",X246),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
        X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                          ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                 ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                        ifelse(grepl("(\\W)( )(:|;)( ){0,1}(.)",X246),gsub("(\\W)( )(:|;)( ){0,1}(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
        X246 = str_replace_all(X246,"\\.{3} \\.{3}","... "),
        X246 = gsub("( : )(.)",". \\U\\2",perl=TRUE,X246)) %>%
 select(ZA_UWAGI, X246)
} else {
  marc_field_246 <- marc_field_246 %>%
 filter(grepl("oryg",X246)) %>%
 select(ZA_UWAGI,`$a`,`$b`) %>%
 group_by(ZA_UWAGI) %>%
 mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = ", "),
        `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = "")) %>%
 ungroup() %>%
 unique() %>%
 unite("X246",`$a`:`$b`,sep = " ",na.rm = TRUE) %>%
 mutate(X246 = str_replace_all(X246," +"," "),
        X246 = str_remove(X246, "\\s+\\/\\s{0,}$"),
        X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                          ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                 ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                        ifelse(grepl("(\\W)( )(:|;)( )(.)",X246),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
        X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                          ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                 ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                        ifelse(grepl("(\\W)( )(:|;)( ){0,1}(.)",X246),gsub("(\\W)( )(:|;)( ){0,1}(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
        X246 = str_replace_all(X246,"\\.{3} \\.{3}","... "),
        X246 = gsub("( : )(.)",". \\U\\2",perl=TRUE,X246)) %>%
 select(ZA_UWAGI, X246)
}

#pole 500
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"~"),
         X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
marc_field_500 <- marc_field_500 %>%
  filter(grepl("oryg\\.\\:",X500)) %>%
  mutate(X500 = str_remove(`$a`,"^Tyt\\. oryg\\.: |^Tyt\\, oryg\\.: |^.*?tyt\\. oryg\\.: "),
         X500 = str_remove(X500, "\\s+\\/\\s{0,}$"),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = str_replace_all(X500,"\\.{3} \\.{3}","... "),
         X500 = str_remove(X500, "\\.$"),
         X500 = str_remove(X500,"(,{0,1} {0,1})\\d{4}.*$|(, t|. T)yt. oryg. cyklu:")) %>%
  select(ZA_UWAGI,X500)
#tytuł oryginału
za_tytul_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_246,by="ZA_UWAGI") %>%
  left_join(.,marc_field_500,by="ZA_UWAGI") %>%
  mutate(X500 = ifelse(is.na(X500),NA,
                       ifelse(grepl("oryg",X500),NA,as.character(X500))),
         X500 = ifelse(!is.na(X500)&grepl("\\. - ",X500),str_replace(X500,"(.*?)(\\. - .*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Na książce pseud",X500),str_replace(X500,"(.*?)(\\. Na książce pseud.*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Przekł\\. wg",X500),str_replace(X500,"(.*?)(\\. Przekł\\. wg.*$)","\\1"),as.character(X500)),
         ZA_TYTUL_ORYGINALU = ifelse(is.na(X246)&is.na(X500),NA,
                                     ifelse(!is.na(X500),as.character(X500),as.character(X246))),
         ZA_TYTUL_ORYGINALU = str_remove_all(ZA_TYTUL_ORYGINALU,'\\"')) %>%
  select(ZA_UWAGI,ZA_TYTUL_ORYGINALU)

#5: język oryginału
marc_field_041 <- data %>%
  select(ZA_UWAGI,X041)%>%
  filter(X041!="") %>%
  mutate(X041=str_replace_all(X041,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X041",sep = "~",direction = "long") %>%
  filter(X041!="") %>%
  mutate(X041=str_remove_all(X041,"^\\|")) %>%
  mutate(indicator = str_replace_all(X041,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X041,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_041)[1]))
colnames(empty_table) <-subfield_list
marc_field_041<-cbind(marc_field_041,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_041$X041 <- str_replace(marc_field_041$X041,subfield_list_char[i],"|\\1")
}
Progress: 1 on 4  Progress: 2 on 4  Progress: 3 on 4  Progress: 4 on 4  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_041[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_041$X041),str_replace_all(gsub(string,"\\3",marc_field_041$X041),"\\${2}.", "~"),NA)
}
Progress: 1 on 4  Progress: 2 on 4  Progress: 3 on 4  Progress: 4 on 4  
za_jezyk_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_041 %>% select(ZA_UWAGI,ZA_JEZYK_ORYGINALU = `$a`),by="ZA_UWAGI") %>%
  mutate(ZA_JEZYK_ORYGINALU = str_replace_all(ZA_JEZYK_ORYGINALU,"\\$a",",")) %>%
  unique()

#6: współtwórcy
marc_field_700 <- data %>%
  select(ZA_UWAGI,X700)%>%
  filter(X700!="") %>%
  mutate(X700=str_replace_all(X700,"(..\\$a)","|\\1"),
         X700=str_replace_all(X700,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X700",sep = "~",direction = "long") %>%
  filter(X700!="") %>%
  mutate(X700=str_remove_all(X700,"^\\|")) %>%
  mutate(indicator = str_replace_all(X700,"(^.*?)(\\$.*)","\\1")) %>%
  filter(X700!="")
subfield_list<- str_extract_all(data$X700,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_700)[1]))
colnames(empty_table) <-subfield_list
marc_field_700<-cbind(marc_field_700,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_700$X700 <- str_replace(marc_field_700$X700,subfield_list_char[i],"|\\1")
}
Progress: 1 on 8  Progress: 2 on 8  Progress: 3 on 8  Progress: 4 on 8  Progress: 5 on 8  Progress: 6 on 8  Progress: 7 on 8  Progress: 8 on 8  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_700[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_700$X700),str_replace_all(gsub(string,"\\3",marc_field_700$X700),"\\${2}.", "~"),NA)
}
Progress: 1 on 8  Progress: 2 on 8  Progress: 3 on 8  Progress: 4 on 8  Progress: 5 on 8  Progress: 6 on 8  Progress: 7 on 8  Progress: 8 on 8  
BN_wspoltworca <- marc_field_700 %>%
  select(ZA_UWAGI,osoba = `$a`,funkcja = `$e`) %>%
  filter(!is.na(funkcja)) %>%
  mutate(osoba = str_remove(osoba,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)"),
         OS_NAZWISKO = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\1"),as.character(osoba)),
         OS_IMIE = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\3"),"*"),
         ws_prosty = str_replace_all(str_to_lower(osoba), "\\W", ""),
         fu_prosta = str_replace_all(str_to_lower(funkcja), "\\W", "")) %>%
  left_join(.,PBL_wspoltworcy %>% select(OS_OSOBA_ID,OS_LICZBA_ZAPISOW,nazwa_prosta),by=c("ws_prosty"="nazwa_prosta")) %>%
  arrange(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,-OS_LICZBA_ZAPISOW)
BN_wspoltworca$id_grupy <- cumsum(!duplicated(BN_wspoltworca[1:2]))
BN_wspoltworca <- BN_wspoltworca[!duplicated(BN_wspoltworca$id_grupy),] %>%
  left_join(.,PBL_funkcje,by=c("fu_prosta"="nazwa")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL",NA,as.character(fo_symbol))) %>%
  select(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,OS_OSOBA_ID,fo_symbol,fo_nazwa,funkcja)

#tutaj przeszukać X245 i znaleźć błędy współtwórców
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,X245c=`$c`)

BN_wspoltworca <- BN_wspoltworca %>%
  left_join(.,marc_field_245,by="ZA_UWAGI")

x <- 1:lengths(BN_wspoltworca[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  BN_wspoltworca$czy_nazwisko[i] <- str_detect(BN_wspoltworca$X245c[i],BN_wspoltworca$OS_NAZWISKO[i])
  BN_wspoltworca$czy_imie[i] <- grepl(BN_wspoltworca$OS_IMIE[i],BN_wspoltworca$X245c[i])
}
Progress:   1 on 755  Progress:   2 on 755  Progress:   3 on 755  Progress:   4 on 755  Progress:   5 on 755  Progress:   6 on 755  Progress:   7 on 755  Progress:   8 on 755  Progress:   9 on 755  Progress:  10 on 755  Progress:  11 on 755  Progress:  12 on 755  Progress:  13 on 755  Progress:  14 on 755  Progress:  15 on 755  Progress:  16 on 755  Progress:  17 on 755  Progress:  18 on 755  Progress:  19 on 755  Progress:  20 on 755  Progress:  21 on 755  Progress:  22 on 755  Progress:  23 on 755  Progress:  24 on 755  Progress:  25 on 755  Progress:  26 on 755  Progress:  27 on 755  Progress:  28 on 755  Progress:  29 on 755  Progress:  30 on 755  Progress:  31 on 755  Progress:  32 on 755  Progress:  33 on 755  Progress:  34 on 755  Progress:  35 on 755  Progress:  36 on 755  Progress:  37 on 755  Progress:  38 on 755  Progress:  39 on 755  Progress:  40 on 755  Progress:  41 on 755  Progress:  42 on 755  Progress:  43 on 755  Progress:  44 on 755  Progress:  45 on 755  Progress:  46 on 755  Progress:  47 on 755  Progress:  48 on 755  Progress:  49 on 755  Progress:  50 on 755  Progress:  51 on 755  Progress:  52 on 755  Progress:  53 on 755  Progress:  54 on 755  Progress:  55 on 755  Progress:  56 on 755  Progress:  57 on 755  Progress:  58 on 755  Progress:  59 on 755  Progress:  60 on 755  Progress:  61 on 755  Progress:  62 on 755  Progress:  63 on 755  Progress:  64 on 755  Progress:  65 on 755  Progress:  66 on 755  Progress:  67 on 755  Progress:  68 on 755  Progress:  69 on 755  Progress:  70 on 755  Progress:  71 on 755  Progress:  72 on 755  Progress:  73 on 755  Progress:  74 on 755  Progress:  75 on 755  Progress:  76 on 755  Progress:  77 on 755  Progress:  78 on 755  Progress:  79 on 755  Progress:  80 on 755  Progress:  81 on 755  Progress:  82 on 755  Progress:  83 on 755  Progress:  84 on 755  Progress:  85 on 755  Progress:  86 on 755  Progress:  87 on 755  Progress:  88 on 755  Progress:  89 on 755  Progress:  90 on 755  Progress:  91 on 755  Progress:  92 on 755  Progress:  93 on 755  Progress:  94 on 755  Progress:  95 on 755  Progress:  96 on 755  Progress:  97 on 755  Progress:  98 on 755  Progress:  99 on 755  Progress: 100 on 755  Progress: 101 on 755  Progress: 102 on 755  Progress: 103 on 755  Progress: 104 on 755  Progress: 105 on 755  Progress: 106 on 755  Progress: 107 on 755  Progress: 108 on 755  Progress: 109 on 755  Progress: 110 on 755  Progress: 111 on 755  Progress: 112 on 755  Progress: 113 on 755  Progress: 114 on 755  Progress: 115 on 755  Progress: 116 on 755  Progress: 117 on 755  Progress: 118 on 755  Progress: 119 on 755  Progress: 120 on 755  Progress: 121 on 755  Progress: 122 on 755  Progress: 123 on 755  Progress: 124 on 755  Progress: 125 on 755  Progress: 126 on 755  Progress: 127 on 755  Progress: 128 on 755  Progress: 129 on 755  Progress: 130 on 755  Progress: 131 on 755  Progress: 132 on 755  Progress: 133 on 755  Progress: 134 on 755  Progress: 135 on 755  Progress: 136 on 755  Progress: 137 on 755  Progress: 138 on 755  Progress: 139 on 755  Progress: 140 on 755  Progress: 141 on 755  Progress: 142 on 755  Progress: 143 on 755  Progress: 144 on 755  Progress: 145 on 755  Progress: 146 on 755  Progress: 147 on 755  Progress: 148 on 755  Progress: 149 on 755  Progress: 150 on 755  Progress: 151 on 755  Progress: 152 on 755  Progress: 153 on 755  Progress: 154 on 755  Progress: 155 on 755  Progress: 156 on 755  Progress: 157 on 755  Progress: 158 on 755  Progress: 159 on 755  Progress: 160 on 755  Progress: 161 on 755  Progress: 162 on 755  Progress: 163 on 755  Progress: 164 on 755  Progress: 165 on 755  Progress: 166 on 755  Progress: 167 on 755  Progress: 168 on 755  Progress: 169 on 755  Progress: 170 on 755  Progress: 171 on 755  Progress: 172 on 755  Progress: 173 on 755  Progress: 174 on 755  Progress: 175 on 755  Progress: 176 on 755  Progress: 177 on 755  Progress: 178 on 755  Progress: 179 on 755  Progress: 180 on 755  Progress: 181 on 755  Progress: 182 on 755  Progress: 183 on 755  Progress: 184 on 755  Progress: 185 on 755  Progress: 186 on 755  Progress: 187 on 755  Progress: 188 on 755  Progress: 189 on 755  Progress: 190 on 755  Progress: 191 on 755  Progress: 192 on 755  Progress: 193 on 755  Progress: 194 on 755  Progress: 195 on 755  Progress: 196 on 755  Progress: 197 on 755  Progress: 198 on 755  Progress: 199 on 755  Progress: 200 on 755  Progress: 201 on 755  Progress: 202 on 755  Progress: 203 on 755  Progress: 204 on 755  Progress: 205 on 755  Progress: 206 on 755  Progress: 207 on 755  Progress: 208 on 755  Progress: 209 on 755  Progress: 210 on 755  Progress: 211 on 755  Progress: 212 on 755  Progress: 213 on 755  Progress: 214 on 755  Progress: 215 on 755  Progress: 216 on 755  Progress: 217 on 755  Progress: 218 on 755  Progress: 219 on 755  Progress: 220 on 755  Progress: 221 on 755  Progress: 222 on 755  Progress: 223 on 755  Progress: 224 on 755  Progress: 225 on 755  Progress: 226 on 755  Progress: 227 on 755  Progress: 228 on 755  Progress: 229 on 755  Progress: 230 on 755  Progress: 231 on 755  Progress: 232 on 755  Progress: 233 on 755  Progress: 234 on 755  Progress: 235 on 755  Progress: 236 on 755  Progress: 237 on 755  Progress: 238 on 755  Progress: 239 on 755  Progress: 240 on 755  Progress: 241 on 755  Progress: 242 on 755  Progress: 243 on 755  Progress: 244 on 755  Progress: 245 on 755  Progress: 246 on 755  Progress: 247 on 755  Progress: 248 on 755  Progress: 249 on 755  Progress: 250 on 755  Progress: 251 on 755  Progress: 252 on 755  Progress: 253 on 755  Progress: 254 on 755  Progress: 255 on 755  Progress: 256 on 755  Progress: 257 on 755  Progress: 258 on 755  Progress: 259 on 755  Progress: 260 on 755  Progress: 261 on 755  Progress: 262 on 755  Progress: 263 on 755  Progress: 264 on 755  Progress: 265 on 755  Progress: 266 on 755  Progress: 267 on 755  Progress: 268 on 755  Progress: 269 on 755  Progress: 270 on 755  Progress: 271 on 755  Progress: 272 on 755  Progress: 273 on 755  Progress: 274 on 755  Progress: 275 on 755  Progress: 276 on 755  Progress: 277 on 755  Progress: 278 on 755  Progress: 279 on 755  Progress: 280 on 755  Progress: 281 on 755  Progress: 282 on 755  Progress: 283 on 755  Progress: 284 on 755  Progress: 285 on 755  Progress: 286 on 755  Progress: 287 on 755  Progress: 288 on 755  Progress: 289 on 755  Progress: 290 on 755  Progress: 291 on 755  Progress: 292 on 755  Progress: 293 on 755  Progress: 294 on 755  Progress: 295 on 755  Progress: 296 on 755  Progress: 297 on 755  Progress: 298 on 755  Progress: 299 on 755  Progress: 300 on 755  Progress: 301 on 755  Progress: 302 on 755  Progress: 303 on 755  Progress: 304 on 755  Progress: 305 on 755  Progress: 306 on 755  Progress: 307 on 755  Progress: 308 on 755  Progress: 309 on 755  Progress: 310 on 755  Progress: 311 on 755  Progress: 312 on 755  Progress: 313 on 755  Progress: 314 on 755  Progress: 315 on 755  Progress: 316 on 755  Progress: 317 on 755  Progress: 318 on 755  Progress: 319 on 755  Progress: 320 on 755  Progress: 321 on 755  Progress: 322 on 755  Progress: 323 on 755  Progress: 324 on 755  Progress: 325 on 755  Progress: 326 on 755  Progress: 327 on 755  Progress: 328 on 755  Progress: 329 on 755  Progress: 330 on 755  Progress: 331 on 755  Progress: 332 on 755  Progress: 333 on 755  Progress: 334 on 755  Progress: 335 on 755  Progress: 336 on 755  Progress: 337 on 755  Progress: 338 on 755  Progress: 339 on 755  Progress: 340 on 755  Progress: 341 on 755  Progress: 342 on 755  Progress: 343 on 755  Progress: 344 on 755  Progress: 345 on 755  Progress: 346 on 755  Progress: 347 on 755  Progress: 348 on 755  Progress: 349 on 755  Progress: 350 on 755  Progress: 351 on 755  Progress: 352 on 755  Progress: 353 on 755  Progress: 354 on 755  Progress: 355 on 755  Progress: 356 on 755  Progress: 357 on 755  Progress: 358 on 755  Progress: 359 on 755  Progress: 360 on 755  Progress: 361 on 755  Progress: 362 on 755  Progress: 363 on 755  Progress: 364 on 755  Progress: 365 on 755  Progress: 366 on 755  Progress: 367 on 755  Progress: 368 on 755  Progress: 369 on 755  Progress: 370 on 755  Progress: 371 on 755  Progress: 372 on 755  Progress: 373 on 755  Progress: 374 on 755  Progress: 375 on 755  Progress: 376 on 755  Progress: 377 on 755  Progress: 378 on 755  Progress: 379 on 755  Progress: 380 on 755  Progress: 381 on 755  Progress: 382 on 755  Progress: 383 on 755  Progress: 384 on 755  Progress: 385 on 755  Progress: 386 on 755  Progress: 387 on 755  Progress: 388 on 755  Progress: 389 on 755  Progress: 390 on 755  Progress: 391 on 755  Progress: 392 on 755  Progress: 393 on 755  Progress: 394 on 755  Progress: 395 on 755  Progress: 396 on 755  Progress: 397 on 755  Progress: 398 on 755  Progress: 399 on 755  Progress: 400 on 755  Progress: 401 on 755  Progress: 402 on 755  Progress: 403 on 755  Progress: 404 on 755  Progress: 405 on 755  Progress: 406 on 755  Progress: 407 on 755  Progress: 408 on 755  Progress: 409 on 755  Progress: 410 on 755  Progress: 411 on 755  Progress: 412 on 755  Progress: 413 on 755  Progress: 414 on 755  Progress: 415 on 755  Progress: 416 on 755  Progress: 417 on 755  Progress: 418 on 755  Progress: 419 on 755  Progress: 420 on 755  Progress: 421 on 755  Progress: 422 on 755  Progress: 423 on 755  Progress: 424 on 755  Progress: 425 on 755  Progress: 426 on 755  Progress: 427 on 755  Progress: 428 on 755  Progress: 429 on 755  Progress: 430 on 755  Progress: 431 on 755  Progress: 432 on 755  Progress: 433 on 755  Progress: 434 on 755  Progress: 435 on 755  Progress: 436 on 755  Progress: 437 on 755  Progress: 438 on 755  Progress: 439 on 755  Progress: 440 on 755  Progress: 441 on 755  Progress: 442 on 755  Progress: 443 on 755  Progress: 444 on 755  Progress: 445 on 755  Progress: 446 on 755  Progress: 447 on 755  Progress: 448 on 755  Progress: 449 on 755  Progress: 450 on 755  Progress: 451 on 755  Progress: 452 on 755  Progress: 453 on 755  Progress: 454 on 755  Progress: 455 on 755  Progress: 456 on 755  Progress: 457 on 755  Progress: 458 on 755  Progress: 459 on 755  Progress: 460 on 755  Progress: 461 on 755  Progress: 462 on 755  Progress: 463 on 755  Progress: 464 on 755  Progress: 465 on 755  Progress: 466 on 755  Progress: 467 on 755  Progress: 468 on 755  Progress: 469 on 755  Progress: 470 on 755  Progress: 471 on 755  Progress: 472 on 755  Progress: 473 on 755  Progress: 474 on 755  Progress: 475 on 755  Progress: 476 on 755  Progress: 477 on 755  Progress: 478 on 755  Progress: 479 on 755  Progress: 480 on 755  Progress: 481 on 755  Progress: 482 on 755  Progress: 483 on 755  Progress: 484 on 755  Progress: 485 on 755  Progress: 486 on 755  Progress: 487 on 755  Progress: 488 on 755  Progress: 489 on 755  Progress: 490 on 755  Progress: 491 on 755  Progress: 492 on 755  Progress: 493 on 755  Progress: 494 on 755  Progress: 495 on 755  Progress: 496 on 755  Progress: 497 on 755  Progress: 498 on 755  Progress: 499 on 755  Progress: 500 on 755  Progress: 501 on 755  Progress: 502 on 755  Progress: 503 on 755  Progress: 504 on 755  Progress: 505 on 755  Progress: 506 on 755  Progress: 507 on 755  Progress: 508 on 755  Progress: 509 on 755  Progress: 510 on 755  Progress: 511 on 755  Progress: 512 on 755  Progress: 513 on 755  Progress: 514 on 755  Progress: 515 on 755  Progress: 516 on 755  Progress: 517 on 755  Progress: 518 on 755  Progress: 519 on 755  Progress: 520 on 755  Progress: 521 on 755  Progress: 522 on 755  Progress: 523 on 755  Progress: 524 on 755  Progress: 525 on 755  Progress: 526 on 755  Progress: 527 on 755  Progress: 528 on 755  Progress: 529 on 755  Progress: 530 on 755  Progress: 531 on 755  Progress: 532 on 755  Progress: 533 on 755  Progress: 534 on 755  Progress: 535 on 755  Progress: 536 on 755  Progress: 537 on 755  Progress: 538 on 755  Progress: 539 on 755  Progress: 540 on 755  Progress: 541 on 755  Progress: 542 on 755  Progress: 543 on 755  Progress: 544 on 755  Progress: 545 on 755  Progress: 546 on 755  Progress: 547 on 755  Progress: 548 on 755  Progress: 549 on 755  Progress: 550 on 755  Progress: 551 on 755  Progress: 552 on 755  Progress: 553 on 755  Progress: 554 on 755  Progress: 555 on 755  Progress: 556 on 755  Progress: 557 on 755  Progress: 558 on 755  Progress: 559 on 755  Progress: 560 on 755  Progress: 561 on 755  Progress: 562 on 755  Progress: 563 on 755  Progress: 564 on 755  Progress: 565 on 755  Progress: 566 on 755  Progress: 567 on 755  Progress: 568 on 755  Progress: 569 on 755  Progress: 570 on 755  Progress: 571 on 755  Progress: 572 on 755  Progress: 573 on 755  Progress: 574 on 755  Progress: 575 on 755  Progress: 576 on 755  Progress: 577 on 755  Progress: 578 on 755  Progress: 579 on 755  Progress: 580 on 755  Progress: 581 on 755  Progress: 582 on 755  Progress: 583 on 755  Progress: 584 on 755  Progress: 585 on 755  Progress: 586 on 755  Progress: 587 on 755  Progress: 588 on 755  Progress: 589 on 755  Progress: 590 on 755  Progress: 591 on 755  Progress: 592 on 755  Progress: 593 on 755  Progress: 594 on 755  Progress: 595 on 755  Progress: 596 on 755  Progress: 597 on 755  Progress: 598 on 755  Progress: 599 on 755  Progress: 600 on 755  Progress: 601 on 755  Progress: 602 on 755  Progress: 603 on 755  Progress: 604 on 755  Progress: 605 on 755  Progress: 606 on 755  Progress: 607 on 755  Progress: 608 on 755  Progress: 609 on 755  Progress: 610 on 755  Progress: 611 on 755  Progress: 612 on 755  Progress: 613 on 755  Progress: 614 on 755  Progress: 615 on 755  Progress: 616 on 755  Progress: 617 on 755  Progress: 618 on 755  Progress: 619 on 755  Progress: 620 on 755  Progress: 621 on 755  Progress: 622 on 755  Progress: 623 on 755  Progress: 624 on 755  Progress: 625 on 755  Progress: 626 on 755  Progress: 627 on 755  Progress: 628 on 755  Progress: 629 on 755  Progress: 630 on 755  Progress: 631 on 755  Progress: 632 on 755  Progress: 633 on 755  Progress: 634 on 755  Progress: 635 on 755  Progress: 636 on 755  Progress: 637 on 755  Progress: 638 on 755  Progress: 639 on 755  Progress: 640 on 755  Progress: 641 on 755  Progress: 642 on 755  Progress: 643 on 755  Progress: 644 on 755  Progress: 645 on 755  Progress: 646 on 755  Progress: 647 on 755  Progress: 648 on 755  Progress: 649 on 755  Progress: 650 on 755  Progress: 651 on 755  Progress: 652 on 755  Progress: 653 on 755  Progress: 654 on 755  Progress: 655 on 755  Progress: 656 on 755  Progress: 657 on 755  Progress: 658 on 755  Progress: 659 on 755  Progress: 660 on 755  Progress: 661 on 755  Progress: 662 on 755  Progress: 663 on 755  Progress: 664 on 755  Progress: 665 on 755  Progress: 666 on 755  Progress: 667 on 755  Progress: 668 on 755  Progress: 669 on 755  Progress: 670 on 755  Progress: 671 on 755  Progress: 672 on 755  Progress: 673 on 755  Progress: 674 on 755  Progress: 675 on 755  Progress: 676 on 755  Progress: 677 on 755  Progress: 678 on 755  Progress: 679 on 755  Progress: 680 on 755  Progress: 681 on 755  Progress: 682 on 755  Progress: 683 on 755  Progress: 684 on 755  Progress: 685 on 755  Progress: 686 on 755  Progress: 687 on 755  Progress: 688 on 755  Progress: 689 on 755  Progress: 690 on 755  Progress: 691 on 755  Progress: 692 on 755  Progress: 693 on 755  Progress: 694 on 755  Progress: 695 on 755  Progress: 696 on 755  Progress: 697 on 755  Progress: 698 on 755  Progress: 699 on 755  Progress: 700 on 755  Progress: 701 on 755  Progress: 702 on 755  Progress: 703 on 755  Progress: 704 on 755  Progress: 705 on 755  Progress: 706 on 755  Progress: 707 on 755  Progress: 708 on 755  Progress: 709 on 755  Progress: 710 on 755  Progress: 711 on 755  Progress: 712 on 755  Progress: 713 on 755  Progress: 714 on 755  Progress: 715 on 755  Progress: 716 on 755  Progress: 717 on 755  Progress: 718 on 755  Progress: 719 on 755  Progress: 720 on 755  Progress: 721 on 755  Progress: 722 on 755  Progress: 723 on 755  Progress: 724 on 755  Progress: 725 on 755  Progress: 726 on 755  Progress: 727 on 755  Progress: 728 on 755  Progress: 729 on 755  Progress: 730 on 755  Progress: 731 on 755  Progress: 732 on 755  Progress: 733 on 755  Progress: 734 on 755  Progress: 735 on 755  Progress: 736 on 755  Progress: 737 on 755  Progress: 738 on 755  Progress: 739 on 755  Progress: 740 on 755  Progress: 741 on 755  Progress: 742 on 755  Progress: 743 on 755  Progress: 744 on 755  Progress: 745 on 755  Progress: 746 on 755  Progress: 747 on 755  Progress: 748 on 755  Progress: 749 on 755  Progress: 750 on 755  Progress: 751 on 755  Progress: 752 on 755  Progress: 753 on 755  Progress: 754 on 755  Progress: 755 on 755  
BN_wspoltworca <- BN_wspoltworca %>%
  mutate(ZA_ADNOTACJE = ifelse(czy_nazwisko==FALSE|czy_imie==FALSE,paste("UWAGA! Konflikt w danych osobowych w polach 700 i 245. Porównaj pola współtórców w formularzu z polem BN: ",X245c,sep = ""),NA)) %>%
  select(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,OS_OSOBA_ID,fo_symbol,fo_nazwa,funkcja,ZA_ADNOTACJE)

#7: opis współtwórców
opis_wspoltworcow <- BN_wspoltworca %>%
  select(ZA_UWAGI,funkcja,OS_IMIE,OS_NAZWISKO) %>%
  full_join(.,marc_field_245,by="ZA_UWAGI") %>%
  filter(!is.na(OS_NAZWISKO)|(is.na(OS_NAZWISKO)&grepl("et al\\.",X245c))) %>%
  mutate(jest_et_al = grepl("et al\\.",X245c),
         OS_IMIE = ifelse(OS_IMIE=="*","",as.character(OS_IMIE)),
         opis = ifelse(!is.na(OS_NAZWISKO),paste(funkcja,OS_IMIE, OS_NAZWISKO, sep = " "),""),
         opis = str_replace_all(opis," +"," "),
         opis = ifelse(opis==" ","",as.character(opis))) %>%
  select(ZA_UWAGI,opis,jest_et_al) %>%
  group_by(ZA_UWAGI) %>%
  mutate(opis = paste(opis,collapse = ", "),
         jest_et_al = paste(unique(jest_et_al),sep = "")) %>%
  ungroup() %>%
  unique() %>%
  mutate(opis = ifelse(jest_et_al==TRUE&opis=="","et al.",
                       ifelse(jest_et_al,paste(opis,"et al.",sep = " "),opis))) %>%
  select(ZA_UWAGI,opis)

#700
marc_field_700 <- data %>%
  select(ZA_UWAGI,X700)%>%
  filter(X700!="") %>%
  mutate(X700=str_replace_all(X700,"(..\\$a)","|\\1"),
         X700=str_replace_all(X700,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X700",sep = "~",direction = "long") %>%
  filter(X700!="") %>%
  mutate(X700=str_remove_all(X700,"^\\|")) %>%
  mutate(indicator = str_replace_all(X700,"(^.*?)(\\$.*)","\\1")) %>%
  filter(X700!="")
subfield_list<- str_extract_all(data$X700,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_700)[1]))
colnames(empty_table) <-subfield_list
marc_field_700<-cbind(marc_field_700,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_700$X700 <- str_replace(marc_field_700$X700,subfield_list_char[i],"|\\1")
}
Progress: 1 on 8  Progress: 2 on 8  Progress: 3 on 8  Progress: 4 on 8  Progress: 5 on 8  Progress: 6 on 8  Progress: 7 on 8  Progress: 8 on 8  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_700[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_700$X700),str_replace_all(gsub(string,"\\3",marc_field_700$X700),"\\${2}.", "~"),NA)
}
Progress: 1 on 8  Progress: 2 on 8  Progress: 3 on 8  Progress: 4 on 8  Progress: 5 on 8  Progress: 6 on 8  Progress: 7 on 8  Progress: 8 on 8  
marc_field_700 <- marc_field_700 %>%
  select(ZA_UWAGI,osoba = `$a`,funkcja = `$e`) %>%
  filter(!is.na(funkcja)) %>%
  mutate(osoba = str_remove(osoba,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)"),
         OS_NAZWISKO = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\1"),as.character(osoba)),
         OS_IMIE = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\3"),"*"),
         funkcja_duza = str_to_lower(funkcja),
         opis = paste(funkcja_duza,OS_IMIE,OS_NAZWISKO, sep = " "),
         opis_duzy = paste(funkcja,OS_IMIE,OS_NAZWISKO, sep = " ")) %>%
  select(ZA_UWAGI,opis,opis_duzy) %>%
  group_by(ZA_UWAGI) %>%
  mutate(opis = paste(opis,collapse = ". "),
         opis_duzy = paste(opis_duzy,collapse = ". ")) %>%
  ungroup() %>%
  unique()

#opis współtwórców ze strefy odpowiedzialności 245
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,`$c`)

#porównanie opisu współtwórców z 245 i 700
wspoltworcy <- marc_field_700 %>%
  full_join(.,marc_field_245,by="ZA_UWAGI") %>%
  cSplit(.,"$c",sep = " ; ",direction = "long") %>%
  #ograniczanie osób ze strefy odpowiedzialności
  mutate(czy_mala = grepl(" [a-zęóąśłżźćń]|^[a-zęóąśłżźćń]|\\[[a-zęóąśłżźćń]",`$c`,ignore.case = FALSE)) %>%
  filter(czy_mala==TRUE) %>%
  select(-czy_mala) %>%
  #mutate(`$c` = gsub("^(\\[){0,1}([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])","\\1\\U\\2",perl = TRUE,`$c`)) %>%
  group_by(ZA_UWAGI) %>%
  mutate(X245 = paste(`$c`, collapse = ", ")) %>%
  select(-`$c`) %>%
  unique() %>%
  mutate(order_pbl = as.character(str_extract_all(opis,"(?<=^| |\\[|-)([A-ZAÁÀÂÃÄĂĀÅĄÆEÉÈÊËĚĒĖĘIÍÌÎÏĪĮIOÓÒÔÕÖŐØŒUÚÙÛÜŰŪůYÝCĆČçDĎĐĐGĢĞKĶLŁĻNŃÑŇŅŊRŘSŚŠŞSßTŤŦÞŢ8ZŻŹŽa-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])")),
         order_pbl = str_replace_all(order_pbl,"(.*?\")(.)(\".*?.)", "\\2"),
         order_bn = as.character(str_extract_all(X245,"(?<=^| |\\[|-)([A-ZAÁÀÂÃÄĂĀÅĄÆEÉÈÊËĚĒĖĘIÍÌÎÏĪĮIOÓÒÔÕÖŐØŒUÚÙÛÜŰŪůYÝCĆČçDĎĐĐGĢĞKĶLŁĻNŃÑŇŅŊRŘSŚŠŞSßTŤŦÞŢ8ZŻŹŽa-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])")),
         order_bn = str_replace_all(order_bn,"(.*?\")(.)(\".*?.)", "\\2"),
         X245 = str_remove(X245, "\\.$"),
         X245 = str_remove(X245, "\\["),
         X245 = str_remove(X245, "\\]"),
         order_pbl = str_remove_all(order_pbl, "[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]"),
         order_bn = str_remove_all(order_bn, "[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]"),
         to_samo = order_pbl==order_bn,
         X245 = gsub("(^[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(.*)","\\U\\1\\E\\2",perl = TRUE, X245)) %>%
  left_join(.,za_jezyk_oryginalu,by="ZA_UWAGI") %>%
  mutate(czy_pl = grepl("pol",ZA_JEZYK_ORYGINALU)|is.na(ZA_JEZYK_ORYGINALU),
         decyzja = ifelse(to_samo==FALSE|czy_pl==FALSE,FALSE,TRUE))

za_opis_wspoltworcow <- wspoltworcy %>%
  mutate(za_opis_wspoltworcow = ifelse(decyzja==TRUE,as.character(X245),paste(X245,opis_duzy,sep = "#"))) %>%
  select(ZA_UWAGI,opis_duzy,za_opis_wspoltworcow) %>%
  cSplit(.,"za_opis_wspoltworcow",sep = "#",direction = "wide") %>%
  mutate(za_opis_wspoltworcow_2 = ifelse(is.na(za_opis_wspoltworcow_2),'',as.character(za_opis_wspoltworcow_2)),
         to_samo = za_opis_wspoltworcow_1==za_opis_wspoltworcow_2) %>%
  filter(to_samo==FALSE) %>%
  group_by(ZA_UWAGI) %>%
  mutate(za_opis_wspoltworcow = paste(za_opis_wspoltworcow_1,za_opis_wspoltworcow_2,sep = "#"),
         za_opis_wspoltworcow = str_remove_all(za_opis_wspoltworcow,"\\#$")) %>%
  select(ZA_UWAGI,za_opis_wspoltworcow)

opis_wspoltworcow <- opis_wspoltworcow %>%
  filter(ZA_UWAGI %notin% za_opis_wspoltworcow$ZA_UWAGI) %>%
  filter(!is.na(opis)) %>%
  rename(za_opis_wspoltworcow = opis)

za_opis_wspoltworcow <- za_opis_wspoltworcow %>%
  bind_rows(.,opis_wspoltworcow) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#8 wydanie
marc_field_250 <- data %>%
  select(ZA_UWAGI,X250)%>%
  filter(X250!="") %>%
  mutate(X250=str_replace_all(X250,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X250",sep = "~",direction = "long") %>%
  filter(X250!="") %>%
  mutate(X250=str_remove_all(X250,"^\\|")) %>%
  mutate(indicator = str_replace_all(X250,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X250,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_250)[1]))
colnames(empty_table) <-subfield_list
marc_field_250<-cbind(marc_field_250,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_250$X250 <- str_replace(marc_field_250$X250,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_250[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_250$X250),str_replace_all(gsub(string,"\\3",marc_field_250$X250),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
za_wydanie <- marc_field_250 %>%
  select(ZA_UWAGI, wydanie = `$a`) %>%
  mutate(wydanie = str_remove(wydanie," \\/$")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#9: instytucja sprawcza
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
za_instytucja <- marc_field_245 %>%
  select(ZA_UWAGI,X245c=`$c`) %>%
  filter(!is.na(X245c)) %>%
  mutate(instytucja = ifelse(grepl("\\;",X245c),str_replace_all(X245c, "(.*?)(\\;(?!.*\\;))( )+(.*?$)","\\4"),"")) %>%
  left_join(.,BN_wspoltworca,by="ZA_UWAGI")

x <- 1:lengths(za_instytucja[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  za_instytucja$czy_nazwisko[i] <- grepl(za_instytucja$OS_NAZWISKO[i],za_instytucja$X245c[i])
  za_instytucja$czy_imie[i] <- grepl(za_instytucja$OS_IMIE[i],za_instytucja$X245c[i])
}
Progress:   1 on 794  Progress:   2 on 794  Progress:   3 on 794  Progress:   4 on 794  Progress:   5 on 794  Progress:   6 on 794  Progress:   7 on 794  Progress:   8 on 794  Progress:   9 on 794  Progress:  10 on 794  Progress:  11 on 794  Progress:  12 on 794  Progress:  13 on 794  Progress:  14 on 794  Progress:  15 on 794  Progress:  16 on 794  Progress:  17 on 794  Progress:  18 on 794  Progress:  19 on 794  Progress:  20 on 794  Progress:  21 on 794  Progress:  22 on 794  Progress:  23 on 794  Progress:  24 on 794  Progress:  25 on 794  Progress:  26 on 794  Progress:  27 on 794  Progress:  28 on 794  Progress:  29 on 794  Progress:  30 on 794  Progress:  31 on 794  Progress:  32 on 794  Progress:  33 on 794  Progress:  34 on 794  Progress:  35 on 794  Progress:  36 on 794  Progress:  37 on 794  Progress:  38 on 794  Progress:  39 on 794  Progress:  40 on 794  Progress:  41 on 794  Progress:  42 on 794  Progress:  43 on 794  Progress:  44 on 794  Progress:  45 on 794  Progress:  46 on 794  Progress:  47 on 794  Progress:  48 on 794  Progress:  49 on 794  Progress:  50 on 794  Progress:  51 on 794  Progress:  52 on 794  Progress:  53 on 794  Progress:  54 on 794  Progress:  55 on 794  Progress:  56 on 794  Progress:  57 on 794  Progress:  58 on 794  Progress:  59 on 794  Progress:  60 on 794  Progress:  61 on 794  Progress:  62 on 794  Progress:  63 on 794  Progress:  64 on 794  Progress:  65 on 794  Progress:  66 on 794  Progress:  67 on 794  Progress:  68 on 794  Progress:  69 on 794  Progress:  70 on 794  Progress:  71 on 794  Progress:  72 on 794  Progress:  73 on 794  Progress:  74 on 794  Progress:  75 on 794  Progress:  76 on 794  Progress:  77 on 794  Progress:  78 on 794  Progress:  79 on 794  Progress:  80 on 794  Progress:  81 on 794  Progress:  82 on 794  Progress:  83 on 794  Progress:  84 on 794  Progress:  85 on 794  Progress:  86 on 794  Progress:  87 on 794  Progress:  88 on 794  Progress:  89 on 794  Progress:  90 on 794  Progress:  91 on 794  Progress:  92 on 794  Progress:  93 on 794  Progress:  94 on 794  Progress:  95 on 794  Progress:  96 on 794  Progress:  97 on 794  Progress:  98 on 794  Progress:  99 on 794  Progress: 100 on 794  Progress: 101 on 794  Progress: 102 on 794  Progress: 103 on 794  Progress: 104 on 794  Progress: 105 on 794  Progress: 106 on 794  Progress: 107 on 794  Progress: 108 on 794  Progress: 109 on 794  Progress: 110 on 794  Progress: 111 on 794  Progress: 112 on 794  Progress: 113 on 794  Progress: 114 on 794  Progress: 115 on 794  Progress: 116 on 794  Progress: 117 on 794  Progress: 118 on 794  Progress: 119 on 794  Progress: 120 on 794  Progress: 121 on 794  Progress: 122 on 794  Progress: 123 on 794  Progress: 124 on 794  Progress: 125 on 794  Progress: 126 on 794  Progress: 127 on 794  Progress: 128 on 794  Progress: 129 on 794  Progress: 130 on 794  Progress: 131 on 794  Progress: 132 on 794  Progress: 133 on 794  Progress: 134 on 794  Progress: 135 on 794  Progress: 136 on 794  Progress: 137 on 794  Progress: 138 on 794  Progress: 139 on 794  Progress: 140 on 794  Progress: 141 on 794  Progress: 142 on 794  Progress: 143 on 794  Progress: 144 on 794  Progress: 145 on 794  Progress: 146 on 794  Progress: 147 on 794  Progress: 148 on 794  Progress: 149 on 794  Progress: 150 on 794  Progress: 151 on 794  Progress: 152 on 794  Progress: 153 on 794  Progress: 154 on 794  Progress: 155 on 794  Progress: 156 on 794  Progress: 157 on 794  Progress: 158 on 794  Progress: 159 on 794  Progress: 160 on 794  Progress: 161 on 794  Progress: 162 on 794  Progress: 163 on 794  Progress: 164 on 794  Progress: 165 on 794  Progress: 166 on 794  Progress: 167 on 794  Progress: 168 on 794  Progress: 169 on 794  Progress: 170 on 794  Progress: 171 on 794  Progress: 172 on 794  Progress: 173 on 794  Progress: 174 on 794  Progress: 175 on 794  Progress: 176 on 794  Progress: 177 on 794  Progress: 178 on 794  Progress: 179 on 794  Progress: 180 on 794  Progress: 181 on 794  Progress: 182 on 794  Progress: 183 on 794  Progress: 184 on 794  Progress: 185 on 794  Progress: 186 on 794  Progress: 187 on 794  Progress: 188 on 794  Progress: 189 on 794  Progress: 190 on 794  Progress: 191 on 794  Progress: 192 on 794  Progress: 193 on 794  Progress: 194 on 794  Progress: 195 on 794  Progress: 196 on 794  Progress: 197 on 794  Progress: 198 on 794  Progress: 199 on 794  Progress: 200 on 794  Progress: 201 on 794  Progress: 202 on 794  Progress: 203 on 794  Progress: 204 on 794  Progress: 205 on 794  Progress: 206 on 794  Progress: 207 on 794  Progress: 208 on 794  Progress: 209 on 794  Progress: 210 on 794  Progress: 211 on 794  Progress: 212 on 794  Progress: 213 on 794  Progress: 214 on 794  Progress: 215 on 794  Progress: 216 on 794  Progress: 217 on 794  Progress: 218 on 794  Progress: 219 on 794  Progress: 220 on 794  Progress: 221 on 794  Progress: 222 on 794  Progress: 223 on 794  Progress: 224 on 794  Progress: 225 on 794  Progress: 226 on 794  Progress: 227 on 794  Progress: 228 on 794  Progress: 229 on 794  Progress: 230 on 794  Progress: 231 on 794  Progress: 232 on 794  Progress: 233 on 794  Progress: 234 on 794  Progress: 235 on 794  Progress: 236 on 794  Progress: 237 on 794  Progress: 238 on 794  Progress: 239 on 794  Progress: 240 on 794  Progress: 241 on 794  Progress: 242 on 794  Progress: 243 on 794  Progress: 244 on 794  Progress: 245 on 794  Progress: 246 on 794  Progress: 247 on 794  Progress: 248 on 794  Progress: 249 on 794  Progress: 250 on 794  Progress: 251 on 794  Progress: 252 on 794  Progress: 253 on 794  Progress: 254 on 794  Progress: 255 on 794  Progress: 256 on 794  Progress: 257 on 794  Progress: 258 on 794  Progress: 259 on 794  Progress: 260 on 794  Progress: 261 on 794  Progress: 262 on 794  Progress: 263 on 794  Progress: 264 on 794  Progress: 265 on 794  Progress: 266 on 794  Progress: 267 on 794  Progress: 268 on 794  Progress: 269 on 794  Progress: 270 on 794  Progress: 271 on 794  Progress: 272 on 794  Progress: 273 on 794  Progress: 274 on 794  Progress: 275 on 794  Progress: 276 on 794  Progress: 277 on 794  Progress: 278 on 794  Progress: 279 on 794  Progress: 280 on 794  Progress: 281 on 794  Progress: 282 on 794  Progress: 283 on 794  Progress: 284 on 794  Progress: 285 on 794  Progress: 286 on 794  Progress: 287 on 794  Progress: 288 on 794  Progress: 289 on 794  Progress: 290 on 794  Progress: 291 on 794  Progress: 292 on 794  Progress: 293 on 794  Progress: 294 on 794  Progress: 295 on 794  Progress: 296 on 794  Progress: 297 on 794  Progress: 298 on 794  Progress: 299 on 794  Progress: 300 on 794  Progress: 301 on 794  Progress: 302 on 794  Progress: 303 on 794  Progress: 304 on 794  Progress: 305 on 794  Progress: 306 on 794  Progress: 307 on 794  Progress: 308 on 794  Progress: 309 on 794  Progress: 310 on 794  Progress: 311 on 794  Progress: 312 on 794  Progress: 313 on 794  Progress: 314 on 794  Progress: 315 on 794  Progress: 316 on 794  Progress: 317 on 794  Progress: 318 on 794  Progress: 319 on 794  Progress: 320 on 794  Progress: 321 on 794  Progress: 322 on 794  Progress: 323 on 794  Progress: 324 on 794  Progress: 325 on 794  Progress: 326 on 794  Progress: 327 on 794  Progress: 328 on 794  Progress: 329 on 794  Progress: 330 on 794  Progress: 331 on 794  Progress: 332 on 794  Progress: 333 on 794  Progress: 334 on 794  Progress: 335 on 794  Progress: 336 on 794  Progress: 337 on 794  Progress: 338 on 794  Progress: 339 on 794  Progress: 340 on 794  Progress: 341 on 794  Progress: 342 on 794  Progress: 343 on 794  Progress: 344 on 794  Progress: 345 on 794  Progress: 346 on 794  Progress: 347 on 794  Progress: 348 on 794  Progress: 349 on 794  Progress: 350 on 794  Progress: 351 on 794  Progress: 352 on 794  Progress: 353 on 794  Progress: 354 on 794  Progress: 355 on 794  Progress: 356 on 794  Progress: 357 on 794  Progress: 358 on 794  Progress: 359 on 794  Progress: 360 on 794  Progress: 361 on 794  Progress: 362 on 794  Progress: 363 on 794  Progress: 364 on 794  Progress: 365 on 794  Progress: 366 on 794  Progress: 367 on 794  Progress: 368 on 794  Progress: 369 on 794  Progress: 370 on 794  Progress: 371 on 794  Progress: 372 on 794  Progress: 373 on 794  Progress: 374 on 794  Progress: 375 on 794  Progress: 376 on 794  Progress: 377 on 794  Progress: 378 on 794  Progress: 379 on 794  Progress: 380 on 794  Progress: 381 on 794  Progress: 382 on 794  Progress: 383 on 794  Progress: 384 on 794  Progress: 385 on 794  Progress: 386 on 794  Progress: 387 on 794  Progress: 388 on 794  Progress: 389 on 794  Progress: 390 on 794  Progress: 391 on 794  Progress: 392 on 794  Progress: 393 on 794  Progress: 394 on 794  Progress: 395 on 794  Progress: 396 on 794  Progress: 397 on 794  Progress: 398 on 794  Progress: 399 on 794  Progress: 400 on 794  Progress: 401 on 794  Progress: 402 on 794  Progress: 403 on 794  Progress: 404 on 794  Progress: 405 on 794  Progress: 406 on 794  Progress: 407 on 794  Progress: 408 on 794  Progress: 409 on 794  Progress: 410 on 794  Progress: 411 on 794  Progress: 412 on 794  Progress: 413 on 794  Progress: 414 on 794  Progress: 415 on 794  Progress: 416 on 794  Progress: 417 on 794  Progress: 418 on 794  Progress: 419 on 794  Progress: 420 on 794  Progress: 421 on 794  Progress: 422 on 794  Progress: 423 on 794  Progress: 424 on 794  Progress: 425 on 794  Progress: 426 on 794  Progress: 427 on 794  Progress: 428 on 794  Progress: 429 on 794  Progress: 430 on 794  Progress: 431 on 794  Progress: 432 on 794  Progress: 433 on 794  Progress: 434 on 794  Progress: 435 on 794  Progress: 436 on 794  Progress: 437 on 794  Progress: 438 on 794  Progress: 439 on 794  Progress: 440 on 794  Progress: 441 on 794  Progress: 442 on 794  Progress: 443 on 794  Progress: 444 on 794  Progress: 445 on 794  Progress: 446 on 794  Progress: 447 on 794  Progress: 448 on 794  Progress: 449 on 794  Progress: 450 on 794  Progress: 451 on 794  Progress: 452 on 794  Progress: 453 on 794  Progress: 454 on 794  Progress: 455 on 794  Progress: 456 on 794  Progress: 457 on 794  Progress: 458 on 794  Progress: 459 on 794  Progress: 460 on 794  Progress: 461 on 794  Progress: 462 on 794  Progress: 463 on 794  Progress: 464 on 794  Progress: 465 on 794  Progress: 466 on 794  Progress: 467 on 794  Progress: 468 on 794  Progress: 469 on 794  Progress: 470 on 794  Progress: 471 on 794  Progress: 472 on 794  Progress: 473 on 794  Progress: 474 on 794  Progress: 475 on 794  Progress: 476 on 794  Progress: 477 on 794  Progress: 478 on 794  Progress: 479 on 794  Progress: 480 on 794  Progress: 481 on 794  Progress: 482 on 794  Progress: 483 on 794  Progress: 484 on 794  Progress: 485 on 794  Progress: 486 on 794  Progress: 487 on 794  Progress: 488 on 794  Progress: 489 on 794  Progress: 490 on 794  Progress: 491 on 794  Progress: 492 on 794  Progress: 493 on 794  Progress: 494 on 794  Progress: 495 on 794  Progress: 496 on 794  Progress: 497 on 794  Progress: 498 on 794  Progress: 499 on 794  Progress: 500 on 794  Progress: 501 on 794  Progress: 502 on 794  Progress: 503 on 794  Progress: 504 on 794  Progress: 505 on 794  Progress: 506 on 794  Progress: 507 on 794  Progress: 508 on 794  Progress: 509 on 794  Progress: 510 on 794  Progress: 511 on 794  Progress: 512 on 794  Progress: 513 on 794  Progress: 514 on 794  Progress: 515 on 794  Progress: 516 on 794  Progress: 517 on 794  Progress: 518 on 794  Progress: 519 on 794  Progress: 520 on 794  Progress: 521 on 794  Progress: 522 on 794  Progress: 523 on 794  Progress: 524 on 794  Progress: 525 on 794  Progress: 526 on 794  Progress: 527 on 794  Progress: 528 on 794  Progress: 529 on 794  Progress: 530 on 794  Progress: 531 on 794  Progress: 532 on 794  Progress: 533 on 794  Progress: 534 on 794  Progress: 535 on 794  Progress: 536 on 794  Progress: 537 on 794  Progress: 538 on 794  Progress: 539 on 794  Progress: 540 on 794  Progress: 541 on 794  Progress: 542 on 794  Progress: 543 on 794  Progress: 544 on 794  Progress: 545 on 794  Progress: 546 on 794  Progress: 547 on 794  Progress: 548 on 794  Progress: 549 on 794  Progress: 550 on 794  Progress: 551 on 794  Progress: 552 on 794  Progress: 553 on 794  Progress: 554 on 794  Progress: 555 on 794  Progress: 556 on 794  Progress: 557 on 794  Progress: 558 on 794  Progress: 559 on 794  Progress: 560 on 794  Progress: 561 on 794  Progress: 562 on 794  Progress: 563 on 794  Progress: 564 on 794  Progress: 565 on 794  Progress: 566 on 794  Progress: 567 on 794  Progress: 568 on 794  Progress: 569 on 794  Progress: 570 on 794  Progress: 571 on 794  Progress: 572 on 794  Progress: 573 on 794  Progress: 574 on 794  Progress: 575 on 794  Progress: 576 on 794  Progress: 577 on 794  Progress: 578 on 794  Progress: 579 on 794  Progress: 580 on 794  Progress: 581 on 794  Progress: 582 on 794  Progress: 583 on 794  Progress: 584 on 794  Progress: 585 on 794  Progress: 586 on 794  Progress: 587 on 794  Progress: 588 on 794  Progress: 589 on 794  Progress: 590 on 794  Progress: 591 on 794  Progress: 592 on 794  Progress: 593 on 794  Progress: 594 on 794  Progress: 595 on 794  Progress: 596 on 794  Progress: 597 on 794  Progress: 598 on 794  Progress: 599 on 794  Progress: 600 on 794  Progress: 601 on 794  Progress: 602 on 794  Progress: 603 on 794  Progress: 604 on 794  Progress: 605 on 794  Progress: 606 on 794  Progress: 607 on 794  Progress: 608 on 794  Progress: 609 on 794  Progress: 610 on 794  Progress: 611 on 794  Progress: 612 on 794  Progress: 613 on 794  Progress: 614 on 794  Progress: 615 on 794  Progress: 616 on 794  Progress: 617 on 794  Progress: 618 on 794  Progress: 619 on 794  Progress: 620 on 794  Progress: 621 on 794  Progress: 622 on 794  Progress: 623 on 794  Progress: 624 on 794  Progress: 625 on 794  Progress: 626 on 794  Progress: 627 on 794  Progress: 628 on 794  Progress: 629 on 794  Progress: 630 on 794  Progress: 631 on 794  Progress: 632 on 794  Progress: 633 on 794  Progress: 634 on 794  Progress: 635 on 794  Progress: 636 on 794  Progress: 637 on 794  Progress: 638 on 794  Progress: 639 on 794  Progress: 640 on 794  Progress: 641 on 794  Progress: 642 on 794  Progress: 643 on 794  Progress: 644 on 794  Progress: 645 on 794  Progress: 646 on 794  Progress: 647 on 794  Progress: 648 on 794  Progress: 649 on 794  Progress: 650 on 794  Progress: 651 on 794  Progress: 652 on 794  Progress: 653 on 794  Progress: 654 on 794  Progress: 655 on 794  Progress: 656 on 794  Progress: 657 on 794  Progress: 658 on 794  Progress: 659 on 794  Progress: 660 on 794  Progress: 661 on 794  Progress: 662 on 794  Progress: 663 on 794  Progress: 664 on 794  Progress: 665 on 794  Progress: 666 on 794  Progress: 667 on 794  Progress: 668 on 794  Progress: 669 on 794  Progress: 670 on 794  Progress: 671 on 794  Progress: 672 on 794  Progress: 673 on 794  Progress: 674 on 794  Progress: 675 on 794  Progress: 676 on 794  Progress: 677 on 794  Progress: 678 on 794  Progress: 679 on 794  Progress: 680 on 794  Progress: 681 on 794  Progress: 682 on 794  Progress: 683 on 794  Progress: 684 on 794  Progress: 685 on 794  Progress: 686 on 794  Progress: 687 on 794  Progress: 688 on 794  Progress: 689 on 794  Progress: 690 on 794  Progress: 691 on 794  Progress: 692 on 794  Progress: 693 on 794  Progress: 694 on 794  Progress: 695 on 794  Progress: 696 on 794  Progress: 697 on 794  Progress: 698 on 794  Progress: 699 on 794  Progress: 700 on 794  Progress: 701 on 794  Progress: 702 on 794  Progress: 703 on 794  Progress: 704 on 794  Progress: 705 on 794  Progress: 706 on 794  Progress: 707 on 794  Progress: 708 on 794  Progress: 709 on 794  Progress: 710 on 794  Progress: 711 on 794  Progress: 712 on 794  Progress: 713 on 794  Progress: 714 on 794  Progress: 715 on 794  Progress: 716 on 794  Progress: 717 on 794  Progress: 718 on 794  Progress: 719 on 794  Progress: 720 on 794  Progress: 721 on 794  Progress: 722 on 794  Progress: 723 on 794  Progress: 724 on 794  Progress: 725 on 794  Progress: 726 on 794  Progress: 727 on 794  Progress: 728 on 794  Progress: 729 on 794  Progress: 730 on 794  Progress: 731 on 794  Progress: 732 on 794  Progress: 733 on 794  Progress: 734 on 794  Progress: 735 on 794  Progress: 736 on 794  Progress: 737 on 794  Progress: 738 on 794  Progress: 739 on 794  Progress: 740 on 794  Progress: 741 on 794  Progress: 742 on 794  Progress: 743 on 794  Progress: 744 on 794  Progress: 745 on 794  Progress: 746 on 794  Progress: 747 on 794  Progress: 748 on 794  Progress: 749 on 794  Progress: 750 on 794  Progress: 751 on 794  Progress: 752 on 794  Progress: 753 on 794  Progress: 754 on 794  Progress: 755 on 794  Progress: 756 on 794  Progress: 757 on 794  Progress: 758 on 794  Progress: 759 on 794  Progress: 760 on 794  Progress: 761 on 794  Progress: 762 on 794  Progress: 763 on 794  Progress: 764 on 794  Progress: 765 on 794  Progress: 766 on 794  Progress: 767 on 794  Progress: 768 on 794  Progress: 769 on 794  Progress: 770 on 794  Progress: 771 on 794  Progress: 772 on 794  Progress: 773 on 794  Progress: 774 on 794  Progress: 775 on 794  Progress: 776 on 794  Progress: 777 on 794  Progress: 778 on 794  Progress: 779 on 794  Progress: 780 on 794  Progress: 781 on 794  Progress: 782 on 794  Progress: 783 on 794  Progress: 784 on 794  Progress: 785 on 794  Progress: 786 on 794  Progress: 787 on 794  Progress: 788 on 794  Progress: 789 on 794  Progress: 790 on 794  Progress: 791 on 794  Progress: 792 on 794  Progress: 793 on 794  Progress: 794 on 794  
za_instytucja <- za_instytucja %>%
  filter(is.na(czy_nazwisko)&is.na(czy_imie)) %>%
  filter(instytucja!="") %>%
  filter(!grepl("^\\[[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]|^[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]",instytucja)) %>%
  mutate(instytucja = str_remove(instytucja,"\\.$")) %>%
  select(ZA_UWAGI,instytucja) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#10: wydawnictwo
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI, X260) %>%
  mutate(X260 = str_replace_all(X260,"s\\.n\\.", "b.w."), 
         X260 = str_replace_all(X260,"s\\.l\\.", "b.m."), 
         X260 = str_replace_all(X260,"S\\.l\\.", "b.m."), 
         X260 = str_remove(X260,"^\\\\+"), 
         rok_wydania = str_extract_all(X260, "(?<=\\$c).*(?=\\$e)|(?<=\\$c).*"), 
         bez_roku = str_replace_all(X260, ".\\$c.*", ""), 
         ile_wydawnictw = str_count(bez_roku, "\\$b"),
         ile_miejsc = str_count(bez_roku, "\\$a"),
         kolejnosc = str_replace_all(as.character(str_extract_all(bez_roku, "\\$.")), "[^a-z]", ""),
         bez_roku = str_replace_all(bez_roku, ";\\$b", ":$b"),
         wydaw_podziel = ifelse(ile_wydawnictw>ile_miejsc|kolejnosc=="caabb", str_replace_all(bez_roku, "(\\$a)(.*?)( :\\$b.*?)( :\\$b)", "\\1\\2\\3 ;$a\\2\\4"),bez_roku),
         wydawnictwo_test = str_replace_all(wydaw_podziel, "(\\$b)(.*?)( ;\\$a)", "\\1\\2|\\3")) %>%
  select(ZA_UWAGI,rok_wydania,wydawnictwo_test) %>%
  cSplit(., "wydawnictwo_test", sep = "|", direction = "long") %>%
  mutate(wydawnictwo = str_extract_all(wydawnictwo_test, "(?<=\\$b)(.*)"),
         miejsce_wydania = str_replace_all(str_extract_all(wydawnictwo_test, "(?<=\\$a)(.*)(?= {0,1}: {0,1}\\$b)|(?<=\\$a)(.*)($)")," ;\\$a", ", "),
         nazwa_prosta = str_to_lower(str_replace_all(str_replace_all(unlist(wydawnictwo_test), "\\$\\w", ""), "\\W", ""))) %>%
  left_join(.,PBL_wydawnictwa,by="nazwa_prosta") %>%
  mutate(to_samo = wydawnictwo==WY_NAZWA) %>%
  arrange(ZA_UWAGI,-to_samo,-WY_LICZBA_ZAPISOW)
BN_wydawnictwo$id_grupy <- cumsum(!duplicated(BN_wydawnictwo[1:3]))
BN_wydawnictwo <- BN_wydawnictwo[!duplicated(BN_wydawnictwo$id_grupy),] %>%
  mutate(WY_NAZWA = ifelse(!is.na(WY_NAZWA),as.character(WY_NAZWA),as.character(wydawnictwo)),
         WY_MIASTO = ifelse(!is.na(WY_MIASTO),as.character(WY_MIASTO),trim(as.character(miejsce_wydania))),
         rok_wydania = str_replace_all(rok_wydania, "(.*)(\\.)", "\\1"),
         za_rok_wydania = ifelse(nchar(rok_wydania)==4,as.character(rok_wydania),NA),
         do_opisu = ifelse(is.na(za_rok_wydania),paste("[",str_extract(rok_wydania,"\\d{4}"),"]",sep = ""),""),
         WY_MIASTO = ifelse(substr(WY_MIASTO,1,1)=="["&substr(WY_MIASTO,nchar(WY_MIASTO),nchar(WY_MIASTO))!="]"&is.na(WY_WYDAWNICTWO_ID),paste(trim(WY_MIASTO),"]",sep = ""),as.character(WY_MIASTO))) %>%
  select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania,do_opisu) %>% 
  mutate(WY_NAZWA = ifelse(str_count(WY_NAZWA, "\\[")>str_count(WY_NAZWA, "\\]"), paste(WY_NAZWA, "]", sep = ""),
                           ifelse(str_count(WY_NAZWA, "\\[")<str_count(WY_NAZWA, "\\]"), paste("[", WY_NAZWA, sep = ""), as.character(WY_NAZWA))),
         WY_MIASTO = ifelse(str_count(WY_MIASTO, "\\[")>str_count(WY_MIASTO, "\\]"), paste(WY_MIASTO, "]", sep = ""),
                           ifelse(str_count(WY_MIASTO, "\\[")<str_count(WY_MIASTO, "\\]"), paste("[", WY_MIASTO, sep = ""), as.character(WY_MIASTO))))

#11: opis fizyczny książki
#pole 300 do opisu fizycznego
marc_field_300 <- data %>%
  select(ZA_UWAGI,X300)%>%
  filter(X300!="") %>%
  mutate(X300=str_replace_all(X300,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X300",sep = "~",direction = "long") %>%
  filter(X300!="") %>%
  mutate(X300=str_remove_all(X300,"^\\|")) %>%
  mutate(indicator = str_replace_all(X300,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X300,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_300)[1]))
colnames(empty_table) <-subfield_list
marc_field_300<-cbind(marc_field_300,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_300$X300 <- str_replace(marc_field_300$X300,subfield_list_char[i],"|\\1")
}
Progress: 1 on 4  Progress: 2 on 4  Progress: 3 on 4  Progress: 4 on 4  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_300[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_300$X300),str_replace_all(gsub(string,"\\3",marc_field_300$X300),"\\${2}.", "~"),NA)
}
Progress: 1 on 4  Progress: 2 on 4  Progress: 3 on 4  Progress: 4 on 4  
marc_field_300 <- marc_field_300 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$b` = str_remove(`$b`," \\;+$| \\:+$"),
         `$e` = ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`)&grepl("\\+ dysk|płyt",`$e`),str_extract(`$e`,"(?<=\\+)(dysk|płyt.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),
                       ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`),str_extract(`$e`,"(^.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),NA)),
         `$a` = ifelse(is.na(`$a`),"",as.character(`$a`)),
         `$b` = ifelse(is.na(`$b`),"",as.character(`$b`)),
         `$e` = ifelse(is.na(`$e`),"",as.character(`$e`)))
#pole 500 do opisu fizycznego
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
marc_field_500 <- marc_field_500 %>%
  mutate(`$a` = ifelse(grepl("oryg(\\.|\\,)",X500)&grepl("pseud|nazwa",X500,ignore.case = TRUE),str_replace(`$a`,"(^.*?)(\\. )(\\p{Lu}.*$)","\\3"),as.character(`$a`))) %>% 
  filter(!grepl("oryg(\\.|\\,)",`$a`)&grepl("pseud|nazwa|dotycz|pol",`$a`,ignore.case = TRUE)) %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))

#pole 546 do opisu fizycznego
marc_field_546 <- data %>%
  select(ZA_UWAGI,X546)%>%
  filter(X546!="") %>%
  mutate(X546=str_replace_all(X546,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X546",sep = "~",direction = "long") %>%
  filter(X546!="") %>%
  mutate(X546=str_remove_all(X546,"^\\|")) %>%
  mutate(indicator = str_replace_all(X546,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X546,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_546)[1]))
colnames(empty_table) <-subfield_list
marc_field_546<-cbind(marc_field_546,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_546$X546 <- str_replace(marc_field_546$X546,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_546[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_546$X546),str_replace_all(gsub(string,"\\3",marc_field_546$X546),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
marc_field_546 <- marc_field_546 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))

#pole 501 do opisu fizycznego
marc_field_501 <- data %>%
  select(ZA_UWAGI,X501)%>%
  filter(X501!="") %>%
  mutate(X501=str_replace_all(X501,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X501",sep = "~",direction = "long") %>%
  filter(X501!="") %>%
  mutate(X501=str_remove_all(X501,"^\\|")) %>%
  mutate(indicator = str_replace_all(X501,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X501,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_501)[1]))
colnames(empty_table) <-subfield_list
marc_field_501<-cbind(marc_field_501,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_501$X501 <- str_replace(marc_field_501$X501,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_501[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_501$X501),str_replace_all(gsub(string,"\\3",marc_field_501$X501),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
marc_field_501 <- marc_field_501 %>%
  select(ZA_UWAGI, `$a`)

za_opis_ks <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,do_opisu),by="ZA_UWAGI") %>%
  left_join(.,marc_field_300 %>% select(ZA_UWAGI,X300a=`$a`,X300b=`$b`,X300e=`$e`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_500 %>% select(ZA_UWAGI,X500a=`$a`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_546 %>% select(ZA_UWAGI,X546a=`$a`),by="ZA_UWAGI") %>% 
  left_join(.,marc_field_501 %>% select(ZA_UWAGI,X501a=`$a`),by="ZA_UWAGI")
za_opis_ks[is.na(za_opis_ks)]  <- ""
za_opis_ks <- za_opis_ks %>%
  mutate(za_opis_ks = paste(ifelse(do_opisu!="",paste(as.character(do_opisu),", ",sep = ""),""),ifelse(X300a!="",paste(as.character(X300a),", ",sep = ""),""),ifelse(X300b!="",paste(as.character(X300b),", ",sep = ""),""),ifelse(X300e!="",paste(as.character(X300e),", ",sep = ""),""),ifelse(X500a!="",paste(as.character(X500a),", ",sep = ""),""),ifelse(X546a!="",as.character(X546a),""),ifelse(X501a!="",as.character(X501a),""),sep = ""),
         za_opis_ks = str_remove(za_opis_ks,"(, )+$")) %>%
  select(ZA_UWAGI,za_opis_ks) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(za_opis_ks))
za_opis_ks$id_grupy <- cumsum(!duplicated(za_opis_ks[1]))
za_opis_ks <- za_opis_ks[!duplicated(za_opis_ks$id_grupy),] %>%
  select(-id_grupy)

#12: seria wydawnicza
marc_field_490 <- data %>%
  select(ZA_UWAGI,X490,X800,X830) %>%
  mutate(X490 = ifelse(grepl("U\\+",X490),as.character(X830),as.character(X490))) %>%
  mutate(X800 = ifelse(X490!="","",as.character(X800)),
         X830 = ifelse(X490!="","",as.character(X830)),
         X800 = str_replace(X800,"(\\$a)(.*)(\\$t)","\\1"),
         X490 = ifelse(X490==""&X830!="",as.character(X830),
                       ifelse(X490==""&X800!="",as.character(X800),as.character(X490)))) %>%
  select(ZA_UWAGI,X490) %>%
  filter(X490!="") %>%
  mutate(X490=str_replace_all(X490,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X490",sep = "~",direction = "long") %>%
  filter(X490!="") %>%
  mutate(X490=str_remove_all(X490,"^\\|")) %>%
  mutate(indicator = str_replace_all(X490,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X490,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_490)[1]))
colnames(empty_table) <-subfield_list
marc_field_490<-cbind(marc_field_490,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_490$X490 <- str_replace(marc_field_490$X490,subfield_list_char[i],"|\\1")
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_490[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_490$X490),str_replace_all(gsub(string,"\\3",marc_field_490$X490),"\\${2}.", "~"),NA)
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
za_seria_wydawnicza <- marc_field_490 %>%
  mutate(`$a` = str_replace_all(`$a`,"(=)(\\$a)","\\1 "),
         `$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$v` = ifelse(is.na(`$v`),"",as.character(`$v`))) %>%
  filter(!is.na(`$a`)) %>%
  mutate(seria = str_remove(paste("(",`$a`,"; ",`$v`,")",sep = ""),"; (?=\\)$)"),
         seria = gsub("( : )(.)",". \\U\\2",perl=TRUE,seria)) %>%
  select(ZA_UWAGI,seria) %>%
  group_by(ZA_UWAGI) %>%
  mutate(seria = paste(seria,collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(seria = str_replace_all(seria,"\\$.","; ")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#13: tomy
za_tomy <- data %>%
  select(ZA_UWAGI) %>%
  mutate(za_tomy = NA)

#14: adnotacje
za_adnotacje <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,ZA_ADNOTACJE %>% select(ZA_UWAGI,ZA_ADNOTACJE),by="ZA_UWAGI") %>%
  left_join(.,BN_wspoltworca %>% select(ZA_UWAGI,ZA_ADNOTACJE),by="ZA_UWAGI") %>%
  mutate(ZA_ADNOTACJE = paste(ifelse(is.na(ZA_ADNOTACJE.x),"",paste(as.character(ZA_ADNOTACJE.x),"# ",sep = "")),ifelse(is.na(ZA_ADNOTACJE.y),"",as.character(ZA_ADNOTACJE.y)),sep = ""),
         ZA_ADNOTACJE = str_remove(ZA_ADNOTACJE,"(# )+$")) %>%
  select(ZA_UWAGI,ZA_ADNOTACJE) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(ZA_ADNOTACJE))
za_adnotacje$id_grupy <- cumsum(!duplicated(za_adnotacje[1]))
za_adnotacje <- za_adnotacje[!duplicated(za_adnotacje$id_grupy),] %>%
  select(-id_grupy)

#15: BN_URL
BN_URL <- data %>%
  select(ZA_UWAGI,BN_URL)

#wyrównanie liczby wierszy do liczby wierszy obiektu data
BN_wspoltworca <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wspoltworca %>% select(ZA_UWAGI,OS_OSOBA_ID,OS_NAZWISKO,OS_IMIE,fo_symbol),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, OS_OSOBA_ID = paste(OS_OSOBA_ID, collapse="|"), OS_NAZWISKO = paste(OS_NAZWISKO, collapse="|"), OS_IMIE = paste(OS_IMIE, collapse="|"), fo_symbol = paste(fo_symbol, collapse="|")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL","NA",as.character(fo_symbol)))
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, WY_WYDAWNICTWO_ID = paste(WY_WYDAWNICTWO_ID, collapse="|"), WY_NAZWA = paste(WY_NAZWA, collapse="|"), WY_MIASTO = paste(WY_MIASTO, collapse="|"), za_rok_wydania = paste(unique(za_rok_wydania), collapse="|")) %>%
  mutate(za_rok_wydania = ifelse(za_rok_wydania=="NA","",as.integer(za_rok_wydania)))
pojawi戼㸳y si攼㹡 warto㤼㹣ci NA na skutek przekszta戼㸳cenia
#połączenie wszystkich elementów w jedną tabelę
kolejnosc <- data.frame(kolejnosc=c("ZA_UWAGI","RZ_NAZWA","ZA_RO_ROK","ZA_TYPE","RZ_RODZAJ_ID","DZ_NAZWA","DZ_DZIAL_ID","TW_TWORCA_ID","AM_AUTOR_ID","AM_NAZWISKO","AM_IMIE","ZA_TYTUL","ZA_TYTUL_ORYGINALU","ZA_JEZYK_ORYGINALU","OS_OSOBA_ID","OS_NAZWISKO","OS_IMIE","fo_symbol","za_opis_wspoltworcow","wydanie","za_tomy","instytucja","WY_WYDAWNICTWO_ID","WY_MIASTO","WY_NAZWA","za_rok_wydania","za_opis_ks","seria","TW_NAZWISKO","TW_IMIE","redaktor_dzialu","ZA_ADNOTACJE","BN_URL"))
polaczone <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,pola_pbl,by = "ZA_UWAGI") %>%
  left_join(.,BN_autor,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,za_jezyk_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,BN_wspoltworca,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_wspoltworcow,by = "ZA_UWAGI") %>%
  left_join(.,za_wydanie,by = "ZA_UWAGI") %>%
  left_join(.,za_instytucja,by = "ZA_UWAGI") %>%
  left_join(.,BN_wydawnictwo,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_ks,by = "ZA_UWAGI") %>%
  left_join(.,za_seria_wydawnicza,by = "ZA_UWAGI") %>%
  left_join(.,za_tomy,by = "ZA_UWAGI") %>%
  left_join(.,za_adnotacje,by = "ZA_UWAGI") %>%
  left_join(.,BN_URL,by = "ZA_UWAGI") %>%
  select(as.vector(kolejnosc$kolejnosc))
colnames(polaczone) <- c("rekord_BN","rz_nazwa","za_ro_rok","za_type","rz_rodzaj_id","DZ_NAZWA","DZ_DZIAL_ID","tw_tworca_id","am_autor_id","am_nazwisko","am_imie","za_tytul","za_tytul_oryginalu","za_jezyk_oryginalu","os_osoba_id","os_nazwisko","os_imie","fo_symbol","za_opis_wspoltworcow","za_wydanie","za_tomy","za_instytucja","wy_wydawnictwo_id","wy_miejsce","wy_nazwa","za_rok_wydania","za_opis_fizyczny_ksiazki","za_seria_wydawnicza","tw_nazwisko","tw_imie","pracownik","za_adnotacje","BN_URL")

#zasygnalizowanie niepoprawnego kodowania
x <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("<U\\+(....)>",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)!=0,paste(polaczone$za_adnotacje,paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole",sep = ""),sep = "# "),paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole",sep = "")),as.character(polaczone$za_adnotacje))
  polaczone[,i] <- gsub("<U\\+(....)>", "???", polaczone[,i])
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności znaku $ w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("\\$",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności frazy "character(0)" w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("character\\(0\\)",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności znaku # w opisie współtwórców
polaczone$za_adnotacje <- ifelse(grepl("\\#",polaczone$za_opis_wspoltworcow),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności \"#\" współtwórcy z pola 700)",paste(polaczone$za_adnotacje,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności # współtwórcy z pola 700)",sep = "# ")),as.character(polaczone$za_adnotacje))

out <- cSplit(polaczone, c("am_autor_id", "am_nazwisko", "am_imie","os_osoba_id","os_nazwisko", "os_imie", "fo_symbol","wy_wydawnictwo_id","wy_miejsce","wy_nazwa"),sep = "|",direction = "long") %>%
  unique()

out$rekord_BN <- ifelse(is.na(out$rekord_BN),'',as.character(out$rekord_BN))
out$rz_nazwa <- ifelse(is.na(out$rz_nazwa),'',as.character(out$rz_nazwa))
out$za_ro_rok <- ifelse(is.na(out$za_ro_rok),'',as.character(out$za_ro_rok))
out$za_type <- ifelse(is.na(out$za_type),'',as.character(out$za_type))
out$rz_rodzaj_id <- ifelse(is.na(out$rz_rodzaj_id),'',as.character(out$rz_rodzaj_id))
out$DZ_NAZWA <- ifelse(is.na(out$DZ_NAZWA),'',as.character(out$DZ_NAZWA))
out$DZ_DZIAL_ID <- ifelse(is.na(out$DZ_DZIAL_ID),'',as.character(out$DZ_DZIAL_ID))
out$tw_tworca_id <- ifelse(is.na(out$tw_tworca_id),'',as.character(out$tw_tworca_id))
out$am_autor_id <- ifelse(is.na(out$am_autor_id),'',as.character(out$am_autor_id))
out$am_nazwisko <- ifelse(is.na(out$am_nazwisko),'',as.character(out$am_nazwisko))
out$am_imie <- ifelse(is.na(out$am_imie),'',as.character(out$am_imie))
out$za_tytul <- ifelse(is.na(out$za_tytul),'',as.character(out$za_tytul))
out$za_tytul_oryginalu <- ifelse(is.na(out$za_tytul_oryginalu),'',as.character(out$za_tytul_oryginalu))
out$za_jezyk_oryginalu <- ifelse(is.na(out$za_jezyk_oryginalu),'',as.character(out$za_jezyk_oryginalu))
out$os_osoba_id <- ifelse(is.na(out$os_osoba_id),'',as.character(out$os_osoba_id))
out$os_nazwisko <- ifelse(is.na(out$os_nazwisko),'',as.character(out$os_nazwisko))
out$os_imie <- ifelse(is.na(out$os_imie),'',as.character(out$os_imie))
out$fo_symbol <- ifelse(is.na(out$fo_symbol),'',as.character(out$fo_symbol))
out$za_opis_wspoltworcow <- ifelse(is.na(out$za_opis_wspoltworcow),'',as.character(out$za_opis_wspoltworcow))
out$za_wydanie <- ifelse(is.na(out$za_wydanie),'',as.character(out$za_wydanie))
out$za_tomy <- ifelse(is.na(out$za_tomy),'',as.character(out$za_tomy))
out$za_instytucja <- ifelse(is.na(out$za_instytucja),'',as.character(out$za_instytucja))
out$wy_wydawnictwo_id <- ifelse(is.na(out$wy_wydawnictwo_id),'',as.character(out$wy_wydawnictwo_id))
out$wy_miejsce <- ifelse(is.na(out$wy_miejsce),'',as.character(out$wy_miejsce))
out$wy_nazwa <- ifelse(is.na(out$wy_nazwa),'',as.character(out$wy_nazwa))
out$za_rok_wydania <- ifelse(is.na(out$za_rok_wydania),'',as.character(out$za_rok_wydania))
out$za_opis_fizyczny_ksiazki <- ifelse(is.na(out$za_opis_fizyczny_ksiazki),'',as.character(out$za_opis_fizyczny_ksiazki))
out$za_seria_wydawnicza <- ifelse(is.na(out$za_seria_wydawnicza),'',as.character(out$za_seria_wydawnicza))
out$tw_nazwisko <- ifelse(is.na(out$tw_nazwisko),'',as.character(out$tw_nazwisko))
out$tw_imie <- ifelse(is.na(out$tw_imie),'',as.character(out$tw_imie))
out$pracownik <- ifelse(is.na(out$pracownik),'',as.character(out$pracownik))
out$za_adnotacje <- ifelse(is.na(out$za_adnotacje),'',as.character(out$za_adnotacje))
out$BN_URL <- ifelse(is.na(out$BN_URL),'',as.character(out$BN_URL))

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same
out$same[1] <- 0
out$dzielone <- paste(out$am_autor_id,out$am_nazwisko,out$am_imie,out$os_osoba_id,out$os_nazwisko,out$os_imie,out$fo_symbol,out$wy_wydawnictwo_id,out$wy_miejsce,out$wy_nazwa,sep = "")

out <- out %>%
  filter(!(same==1&dzielone=="")) %>%
  select(1:33)

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same

#ucięcie zbyt długich ciągów znaków, by weszły do oracle'a
dlugosci <- data.frame(pole = c("am_nazwisko", "am_imie", "za_tytul", "za_tytul_oryginalu", "za_jezyk_oryginalu", "os_nazwisko", "os_imie", "za_opis_wspoltworcow", "za_instytucja", "wy_miejsce", "wy_nazwa", "za_opis_fizyczny_ksiazki", "za_seria_wydawnicza", "tw_nazwisko", "tw_imie", "za_adnotacje"), liczba_znakow = c(50,40,500,500,100,50,40,500,255,40,255,1000,255,200,40,2000))
x <- match(dlugosci$pole,names(out))
for (i in x) {
  progress(match(i,x), max.value = length(x))
  dlugosc <- dlugosci$liczba_znakow[match(names(out[i]),dlugosci$pole)]
  out$za_adnotacje <- ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje!="",paste(out$za_adnotacje,paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),sep = "# "),
                             ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje=="",paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),as.character(out$za_adnotacje)))
  
  out[,i] <- ifelse(dlugosc<nchar(as.character(out[,i])),as.character(substr(out[,i],1,dlugosc)),as.character(out[,i]))
}
Progress:  1 on 16  Progress:  2 on 16  Progress:  3 on 16  Progress:  4 on 16  Progress:  5 on 16  Progress:  6 on 16  Progress:  7 on 16  Progress:  8 on 16  Progress:  9 on 16  Progress: 10 on 16  Progress: 11 on 16  Progress: 12 on 16  Progress: 13 on 16  Progress: 14 on 16  Progress: 15 on 16  Progress: 16 on 16  
out$rekord_BN[out$same == 1] <- ""
out$rz_nazwa[out$same == 1] <- ""
out$za_ro_rok[out$same == 1] <- ""
out$za_type[out$same == 1] <- ""
out$rz_rodzaj_id[out$same == 1] <- ""
out$DZ_NAZWA[out$same == 1] <- ""
out$DZ_DZIAL_ID[out$same == 1] <- ""
out$tw_tworca_id[out$same == 1] <- ""
out$za_tytul[out$same == 1] <- ""
out$za_tytul_oryginalu[out$same == 1] <- ""
out$za_jezyk_oryginalu[out$same == 1] <- ""
out$za_opis_wspoltworcow[out$same == 1] <- ""
out$za_wydanie[out$same == 1] <- ""
out$za_tomy[out$same == 1] <- ""
out$za_instytucja[out$same == 1] <- ""
out$za_rok_wydania[out$same == 1] <- ""
out$za_opis_fizyczny_ksiazki[out$same == 1] <- ""
out$za_seria_wydawnicza[out$same == 1] <- ""
out$tw_nazwisko[out$same == 1] <- ""
out$tw_imie[out$same == 1] <- ""
out$pracownik[out$same == 1] <- ""
out$za_adnotacje[out$same == 1] <- ""
out$BN_URL[out$same == 1] <- ""

out <- out %>%
  select(1:33)

#pętla zapisująca po ok. 2000 wierszy z uwzględnieniem kompletności rekordów bibliograficznych rozpisanych na kilka wierszy
out <- out %>%
  mutate(podzial = ifelse(rekord_BN!="",as.character(rekord_BN),NA)) %>%
  fill(podzial)
ile <- unique(out$podzial)
ile <- split(unique(ile), ceiling(seq_along(unique(ile))/1500))
x <- 1:length(ile)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  final <- out %>%
    filter(podzial %in% ile[[i]]) %>%
    select(-podzial)
  write.xlsx(final, paste("C:/Users/",employee_name,"/Desktop/",import_year,"_antologie_do_importu",i,".xlsx",sep = ""),sheetName = "gotowe")
}
Progress: 1 on 1  
bn_ok <- chunk11
data <- bn_ok %>%
  filter(rodzaj_ksiazki=="współwydanie") %>%
  mutate(redaktor_dzialu = paste(redaktor_dzialu,"_wsp",sep = ""))

#uwolnienie kolumn z danymi z bn i przetworzenie do PBL
#1: za_uwagi, rz_nazwa, za_ro_rok, za_type, rz_rodzaj_id, tw_tworca_id, tw_nazwisko, tw_imie, dz_dzial_id, dz_nazwa, redaktor_dzialu
pola_pbl <- data %>%
  select(ZA_UWAGI, RZ_NAZWA, ZA_RO_ROK = rok, RZ_RODZAJ_ID, TW_TWORCA_ID, TW_NAZWISKO, TW_IMIE, DZ_DZIAL_ID, DZ_NAZWA, redaktor_dzialu) %>%
  mutate(ZA_TYPE = "KS")

#2: autor
BN_autor <- data %>% 
  select(ZA_UWAGI,X245) %>% 
  mutate(X245 = str_extract(X245, "(?<=\\/\\$c)(.*?)(?= ;|$)"),
         X245 = str_remove(X245,"\\.$"),
         X245 = str_remove(X245,"\\["),
         X245 = str_remove(X245,"\\]"),
         AM_NAZWISKO = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),as.character(X245),str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\3")),
         AM_IMIE = ifelse(grepl(" [a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž\\.]* ",X245),"*",str_replace(X245,"(^.*?)( )(?!.* )(.*$)","\\1")),
         nazwa = str_replace_all(str_to_lower(paste(AM_NAZWISKO,AM_IMIE, sep = "")), "\\W", "")) %>%
  left_join(.,PBL_autorzy %>% select(AM_AUTOR_ID,AM_KRYPTONIM,AM_LICZBA_ZAPISOW,nazwa) %>% filter(is.na(AM_KRYPTONIM)),by="nazwa") %>%
  arrange(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,-AM_LICZBA_ZAPISOW)
BN_autor$id_grupy <- cumsum(!duplicated(BN_autor[1:4]))
BN_autor <- BN_autor[!duplicated(BN_autor$id_grupy),] %>%
  mutate(ZA_ADNOTACJE = NA) %>% 
  select(ZA_UWAGI,AM_NAZWISKO,AM_IMIE,ZA_ADNOTACJE,AM_AUTOR_ID)

#3: tytuł
#pole 245
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
if("$n" %in% colnames(marc_field_245)) {
marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = " "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = " "),
         `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = " "),
         `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  unite("ZA_TYTUL",`$a`:`$p`,sep = " ",na.rm = TRUE) %>% 
  mutate(ZA_TYTUL = str_replace_all(ZA_TYTUL," +"," "),
         ZA_TYTUL = str_remove(ZA_TYTUL, "\\s+\\/\\s{0,}$"),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = str_replace_all(ZA_TYTUL,"\\.{3} \\.{3}","... "),
         ZA_TYTUL = str_replace_all(ZA_TYTUL," ; ",". "),
         ZA_TYTUL = gsub("( : )(.)",". \\U\\2",perl=TRUE,ZA_TYTUL)) %>%
  select(ZA_UWAGI,ZA_TYTUL)
} else {
  marc_field_245 <- marc_field_245 %>%
  select(ZA_UWAGI,`$a`,`$b`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = " "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  unite("ZA_TYTUL",`$a`:`$b`,sep = " ",na.rm = TRUE) %>% 
  mutate(ZA_TYTUL = str_replace_all(ZA_TYTUL," +"," "),
         ZA_TYTUL = str_remove(ZA_TYTUL, "\\s+\\/\\s{0,}$"),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,ZA_TYTUL),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,ZA_TYTUL),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",ZA_TYTUL),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,ZA_TYTUL),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",ZA_TYTUL),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,ZA_TYTUL),as.character(ZA_TYTUL))))),
         ZA_TYTUL = str_replace_all(ZA_TYTUL,"\\.{3} \\.{3}","... "),
         ZA_TYTUL = str_replace_all(ZA_TYTUL," ; ",". "),
         ZA_TYTUL = gsub("( : )(.)",". \\U\\2",perl=TRUE,ZA_TYTUL)) %>%
  select(ZA_UWAGI,ZA_TYTUL)
}
tytul_wspolwydanie <- marc_field_245
#dopisanie gatunku do przedmiotowej na podstawie 655 i 650  
gatunki_pbl <- data.frame(gatunek = c("aforyzm", "album", "antologia", "autobiografia", "dziennik", "esej", "felieton", "inne", "kazanie", "list", "miniatura prozą", "opowiadanie", "poemat", "powieść", "proza", "proza poetycka", "reportaż", "rozmyślanie religijne", "rysunek, obraz", "scenariusz", "szkic", "tekst biblijny", "tekst dramatyczny", "dramat", "wiersz", "wspomnienia", "wypowiedź", "pamiętniki", "poezja", "literatura podróżnicza", "satyra", "piosenka"))

#dramat, pamiętniki, poezja, literatura podróżnicza, satyra, piosenka
gatunki_bn <- data %>%
  select(ZA_UWAGI,X655,X650)

gatunki_bn <- sqldf("select *
                    from gatunki_bn
                    left join gatunki_pbl on lower(gatunki_bn.X655) like '%'||gatunki_pbl.gatunek||'%'")
gatunki_bn <- sqldf("select *
                      from gatunki_bn
                      left join gatunki_pbl on lower(gatunki_bn.X650) like '%'||gatunki_pbl.gatunek||'%'")
colnames(gatunki_bn)[5] <- "gatunek2"
gatunki_bn <- gatunki_bn %>%
  mutate(gatunek = ifelse(is.na(gatunek)&!is.na(gatunek2),as.character(gatunek2),as.character(gatunek)),
         gatunek = ifelse(grepl("przypowieść",X655,ignore.case = TRUE)&!grepl("[^y]powieść",X655)&gatunek=="powieść","opowiadanie",as.character(gatunek))) %>%
  filter(!is.na(gatunek)) %>%
  select(ZA_UWAGI,gatunek) %>%
  mutate(gatunek = ifelse(gatunek=="dramat","tekst dramatyczny",
                          ifelse(gatunek=="pamiętniki","wspomnienia",
                                 ifelse(gatunek=="poezja","wiersz",
                                        ifelse(gatunek=="literatura podróżnicza","reportaż",
                                               ifelse(gatunek=="piosenka","wiersz",as.character(gatunek))))))) %>%
  group_by(ZA_UWAGI) %>%
  mutate(gatunek = paste(gatunek,collapse = ", ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(gatunek = gsub("(^.)","\\U\\1",perl = TRUE, gatunek))
#połączenie tytułu z gatunkiem
za_tytul <- marc_field_245 %>%
  left_join(.,gatunki_bn,by="ZA_UWAGI") %>% 
  mutate(gatunek = paste("[",gatunek,"]",sep = ""),
         gatunek = ifelse(gatunek=="[NA]",NA,as.character(gatunek))) %>% 
  unite("ZA_TYTUL", ZA_TYTUL:gatunek, sep = ". ",na.rm=TRUE) %>% 
  mutate(ZA_TYTUL = str_replace_all(ZA_TYTUL,"\\. \\.",". "),
         ZA_TYTUL = str_replace(ZA_TYTUL,"(\\!)(\\.)|(\\?)(\\.)","\\1"))

#4: tytuł oryginału
#pole 246
marc_field_246 <- data %>%
  select(ZA_UWAGI,X246)%>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"~"),
         X246=str_replace_all(X246,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X246",sep = "~",direction = "long") %>%
  filter(X246!="") %>%
  mutate(X246=str_remove_all(X246,"^\\|")) %>%
  mutate(indicator = str_replace_all(X246,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X246,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_246)[1]))
colnames(empty_table) <-subfield_list
marc_field_246<-cbind(marc_field_246,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_246$X246 <- str_replace(marc_field_246$X246,subfield_list_char[i],"|\\1")
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_246[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_246$X246),str_replace_all(gsub(string,"\\3",marc_field_246$X246),"\\${2}.", "~"),NA)
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
if("$n" %in% colnames(marc_field_246)) {
marc_field_246 <- marc_field_246[, colSums(is.na(marc_field_246)) != nrow(marc_field_246)] %>%
  filter(grepl("oryg",X246)) %>%
  select(ZA_UWAGI,`$a`,`$b`,`$n`,`$p`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = ", "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = ""),
         `$n` = paste(ifelse(is.na(`$n`),"",as.character(`$n`)),collapse = ""),
         `$p` = paste(ifelse(is.na(`$p`),"",as.character(`$p`)),collapse = "")) %>%
  ungroup() %>%
  unique() %>%
  unite("X246",`$a`:`$p`,sep = " ",na.rm = TRUE) %>% 
  mutate(X246 = str_replace_all(X246," +"," "),
         X246 = str_remove(X246, "\\s+\\/\\s{0,}$"),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X246),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( ){0,1}(.)",X246),gsub("(\\W)( )(:|;)( ){0,1}(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = str_replace_all(X246,"\\.{3} \\.{3}","... "),
         X246 = gsub("( : )(.)",". \\U\\2",perl=TRUE,X246)) %>%
  select(ZA_UWAGI, X246)
} else if ("$b" %in% colnames(marc_field_246)){
  marc_field_246 <- marc_field_246[, colSums(is.na(marc_field_246)) != nrow(marc_field_246)] %>%
  filter(grepl("oryg",X246)) %>%
  select(ZA_UWAGI,`$a`,`$b`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = ", "),
         `$b` = paste(ifelse(is.na(`$b`),"",as.character(`$b`)),collapse = "")) %>%
  ungroup() %>%
  unique() %>%
  unite("X246",`$a`:`$b`,sep = " ",na.rm = TRUE) %>% 
  mutate(X246 = str_replace_all(X246," +"," "),
         X246 = str_remove(X246, "\\s+\\/\\s{0,}$"),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X246),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( ){0,1}(.)",X246),gsub("(\\W)( )(:|;)( ){0,1}(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = str_replace_all(X246,"\\.{3} \\.{3}","... "),
         X246 = gsub("( : )(.)",". \\U\\2",perl=TRUE,X246)) %>%
  select(ZA_UWAGI, X246)
} else {
  marc_field_246 <- marc_field_246[, colSums(is.na(marc_field_246)) != nrow(marc_field_246)] %>%
  filter(grepl("oryg",X246)) %>%
  select(ZA_UWAGI,`$a`) %>%
  group_by(ZA_UWAGI) %>%
  mutate(`$a` = paste(ifelse(is.na(`$a`),"",as.character(`$a`)),collapse = ", ")) %>%
  ungroup() %>%
  unique() %>%
  unite("X246",`$a`,sep = " ",na.rm = TRUE) %>% 
  mutate(X246 = str_replace_all(X246," +"," "),
         X246 = str_remove(X246, "\\s+\\/\\s{0,}$"),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X246),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X246),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X246),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X246),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)",X246),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( ){0,1}(.)","\\1.\\2\\U\\5",perl = TRUE,X246),
                                         ifelse(grepl("(\\W)( )(:|;)( ){0,1}(.)",X246),gsub("(\\W)( )(:|;)( ){0,1}(.)","\\1\\2\\U\\5",perl = TRUE,X246),as.character(X246))))),
         X246 = str_replace_all(X246,"\\.{3} \\.{3}","... "),
         X246 = gsub("( : )(.)",". \\U\\2",perl=TRUE,X246)) %>%
  select(ZA_UWAGI, X246)
}

#pole 500
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"~"),
         X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
marc_field_500 <- marc_field_500 %>%
  filter(grepl("oryg\\.\\:",X500)) %>%
  mutate(X500 = str_remove(`$a`,"^Tyt\\. oryg\\.: |^Tyt\\, oryg\\.: |^.*?tyt\\. oryg\\.: "),
         X500 = str_remove(X500, "\\s+\\/\\s{0,}$"),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(\\(|\\[)(.)","\\1.\\2\\5\\U\\6",perl=TRUE,X500),
                           ifelse(grepl("(\\W)( )(:|;)( )(\\(|\\[)(.)",X500),gsub("(\\W)( )(:|;)( )(\\(|\\[)(.)","\\1\\2\\U\\5\\6",perl = TRUE,X500),
                                  ifelse(grepl("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)",X500),gsub("([a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźžIVX])( )(:|;)( )(.)","\\1.\\2\\U\\5",perl = TRUE,X500),
                                         ifelse(grepl("(\\W)( )(:|;)( )(.)",X500),gsub("(\\W)( )(:|;)( )(.)","\\1\\2\\U\\5",perl = TRUE,X500),as.character(X500))))),
         X500 = str_replace_all(X500,"\\.{3} \\.{3}","... "),
         X500 = str_remove(X500, "\\.$"),
         X500 = str_remove(X500,"(,{0,1} {0,1})\\d{4}.*$|(, t|. T)yt. oryg. cyklu:")) %>%
  select(ZA_UWAGI,X500)
#tytuł oryginału
za_tytul_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_246,by="ZA_UWAGI") %>%
  left_join(.,marc_field_500,by="ZA_UWAGI") %>%
  mutate(X500 = ifelse(is.na(X500),NA,
                       ifelse(grepl("oryg",X500),NA,as.character(X500))),
         X500 = ifelse(!is.na(X500)&grepl("\\. - ",X500),str_replace(X500,"(.*?)(\\. - .*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Na książce pseud",X500),str_replace(X500,"(.*?)(\\. Na książce pseud.*$)","\\1"),as.character(X500)),
         X500 = ifelse(!is.na(X500)&grepl("Przekł\\. wg",X500),str_replace(X500,"(.*?)(\\. Przekł\\. wg.*$)","\\1"),as.character(X500)),
         ZA_TYTUL_ORYGINALU = ifelse(is.na(X246)&is.na(X500),NA,
                                     ifelse(!is.na(X500),as.character(X500),as.character(X246))),
         ZA_TYTUL_ORYGINALU = str_remove_all(ZA_TYTUL_ORYGINALU,'\\"')) %>%
  select(ZA_UWAGI,ZA_TYTUL_ORYGINALU)

#5: język oryginału
marc_field_041 <- data %>%
  select(ZA_UWAGI,X041)%>%
  filter(X041!="") %>%
  mutate(X041=str_replace_all(X041,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X041",sep = "~",direction = "long") %>%
  filter(X041!="") %>%
  mutate(X041=str_remove_all(X041,"^\\|")) %>%
  mutate(indicator = str_replace_all(X041,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X041,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_041)[1]))
colnames(empty_table) <-subfield_list
marc_field_041<-cbind(marc_field_041,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_041$X041 <- str_replace(marc_field_041$X041,subfield_list_char[i],"|\\1")
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_041[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_041$X041),str_replace_all(gsub(string,"\\3",marc_field_041$X041),"\\${2}.", "~"),NA)
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
za_jezyk_oryginalu <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,marc_field_041 %>% select(ZA_UWAGI,ZA_JEZYK_ORYGINALU = `$a`),by="ZA_UWAGI") %>%
  mutate(ZA_JEZYK_ORYGINALU = str_replace_all(ZA_JEZYK_ORYGINALU,"\\$a",",")) %>%
  unique()

#6: współtwórcy
BN_wspoltworca <- data %>% 
  select(ZA_UWAGI,X245) %>% 
  mutate(wspoltworca = str_remove(str_remove_all(as.character(str_extract_all(data$X245,"(?<=; )(.*)(?=$)")),"\\.$"),"character\\(0\\)"),
         wspoltworca = str_remove_all(wspoltworca," et al\\."))

marc_field_700 <- data %>%
  select(ZA_UWAGI,X700)%>%
  filter(X700!="") %>%
  mutate(X700=str_replace_all(X700,"(..\\$a)","|\\1"),
         X700=str_replace_all(X700,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X700",sep = "~",direction = "long") %>%
  filter(X700!="") %>%
  mutate(X700=str_remove_all(X700,"^\\|")) %>%
  mutate(indicator = str_replace_all(X700,"(^.*?)(\\$.*)","\\1")) %>%
  filter(X700!="")
subfield_list<- str_extract_all(data$X700,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_700)[1]))
colnames(empty_table) <-subfield_list
marc_field_700<-cbind(marc_field_700,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_700$X700 <- str_replace(marc_field_700$X700,subfield_list_char[i],"|\\1")
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_700[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_700$X700),str_replace_all(gsub(string,"\\3",marc_field_700$X700),"\\${2}.", "~"),NA)
}
Progress: 1 on 5  Progress: 2 on 5  Progress: 3 on 5  Progress: 4 on 5  Progress: 5 on 5  
marc_field_700 <- marc_field_700 %>%
  select(ZA_UWAGI,osoba = `$a`,funkcja = `$e`) %>%
  filter(!is.na(funkcja)) %>%
  mutate(osoba = str_remove(osoba,"(?<=[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž])(\\.$)"),
         osoba = ifelse(!grepl(",",osoba)&str_count(osoba," ")==1,str_replace(osoba," ",", "),as.character(osoba)),
         OS_NAZWISKO = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\1"),as.character(osoba)),
         OS_IMIE = ifelse(grepl(",",osoba),str_replace_all(osoba,"(.*?)(, )(.*)","\\3"),"*"),
         ws_prosty = str_replace_all(str_to_lower(osoba), "\\W", ""),
         fu_prosta = str_replace_all(str_to_lower(funkcja), "\\W", ""))

BN_wspoltworca <- BN_wspoltworca %>% 
  left_join(marc_field_700,by="ZA_UWAGI")

x <- 1:nrow(BN_wspoltworca)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  BN_wspoltworca$czy_nazwisko[i] <- grepl(BN_wspoltworca$OS_NAZWISKO[i],BN_wspoltworca$wspoltworca[i])
  BN_wspoltworca$czy_imie[i] <- grepl(BN_wspoltworca$OS_IMIE[i],BN_wspoltworca$wspoltworca[i])
}
Progress:  1 on 38  Progress:  2 on 38  Progress:  3 on 38  Progress:  4 on 38  Progress:  5 on 38  Progress:  6 on 38  Progress:  7 on 38  Progress:  8 on 38  Progress:  9 on 38  Progress: 10 on 38  Progress: 11 on 38  Progress: 12 on 38  Progress: 13 on 38  Progress: 14 on 38  Progress: 15 on 38  Progress: 16 on 38  Progress: 17 on 38  Progress: 18 on 38  Progress: 19 on 38  Progress: 20 on 38  Progress: 21 on 38  Progress: 22 on 38  Progress: 23 on 38  Progress: 24 on 38  Progress: 25 on 38  Progress: 26 on 38  Progress: 27 on 38  Progress: 28 on 38  Progress: 29 on 38  Progress: 30 on 38  Progress: 31 on 38  Progress: 32 on 38  Progress: 33 on 38  Progress: 34 on 38  Progress: 35 on 38  Progress: 36 on 38  Progress: 37 on 38  Progress: 38 on 38  
if (grepl("0|1",BN_wspoltworca$czy_nazwisko[1])) {
  BN_wspoltworca <- BN_wspoltworca %>% 
    filter(czy_nazwisko==1|czy_imie==1)
} else {
  BN_wspoltworca <- BN_wspoltworca %>% 
    filter(czy_nazwisko==TRUE|czy_imie==TRUE)
}

BN_wspoltworca <- BN_wspoltworca %>% 
  left_join(.,PBL_wspoltworcy %>% select(OS_OSOBA_ID,OS_LICZBA_ZAPISOW,nazwa_prosta),by=c("ws_prosty"="nazwa_prosta")) %>%
  arrange(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,-OS_LICZBA_ZAPISOW)
BN_wspoltworca$id_grupy <- cumsum(!duplicated(BN_wspoltworca[1:4]))
BN_wspoltworca <- BN_wspoltworca[!duplicated(BN_wspoltworca$id_grupy),] %>%
  left_join(.,PBL_funkcje,by=c("fu_prosta"="nazwa")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL",NA,as.character(fo_symbol)),
         ZA_ADNOTACJE = NA) %>%
  select(ZA_UWAGI,OS_NAZWISKO,OS_IMIE,OS_OSOBA_ID,fo_symbol,fo_nazwa,funkcja)

#7: opis współtwórców
za_opis_wspoltworcow <- BN_wspoltworca %>%
  select(ZA_UWAGI,funkcja,OS_IMIE,OS_NAZWISKO) %>% 
  unite("za_opis_wspoltworcow",c(funkcja,OS_IMIE,OS_NAZWISKO),sep = " ",na.rm = TRUE) %>% 
  group_by(ZA_UWAGI) %>%
  mutate(za_opis_wspoltworcow = paste(za_opis_wspoltworcow,collapse = ". ")) %>%
  ungroup() %>%
  unique() %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#8 wydanie
marc_field_250 <- data %>%
  select(ZA_UWAGI,X250)%>%
  filter(X250!="")

if (nrow(marc_field_250) != 0){
marc_field_250 <- marc_field_250 %>%
  mutate(X250=str_replace_all(X250,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X250",sep = "~",direction = "long") %>%
  filter(X250!="") %>%
  mutate(X250=str_remove_all(X250,"^\\|")) %>%
  mutate(indicator = str_replace_all(X250,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X250,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_250)[1]))
colnames(empty_table) <-subfield_list
marc_field_250<-cbind(marc_field_250,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_250$X250 <- str_replace(marc_field_250$X250,subfield_list_char[i],"|\\1")
}

for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_250[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_250$X250),str_replace_all(gsub(string,"\\3",marc_field_250$X250),"\\${2}.", "~"),NA)
}
za_wydanie <- marc_field_250 %>%
  select(ZA_UWAGI, wydanie = `$a`) %>%
  mutate(wydanie = str_remove(wydanie," \\/$")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")
} else {
  za_wydanie <- data.frame(ZA_UWAGI = "", X250 = "", indicator = "", stringsAsFactors = FALSE) %>% 
    mutate(`$a` = "",
           wydanie = "") %>% 
    right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")
}

#9: instytucja sprawcza
marc_field_245 <- data %>%
  select(ZA_UWAGI,X245)%>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"~"),
         X245=str_replace_all(X245,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X245",sep = "~",direction = "long") %>%
  filter(X245!="") %>%
  mutate(X245=str_remove_all(X245,"^\\|")) %>%
  mutate(indicator = str_replace_all(X245,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X245,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_245)[1]))
colnames(empty_table) <-subfield_list
marc_field_245<-cbind(marc_field_245,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_245$X245 <- str_replace(marc_field_245$X245,subfield_list_char[i],"|\\1")
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_245[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_245$X245),str_replace_all(gsub(string,"\\3",marc_field_245$X245),"\\${2}.", "~"),NA)
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
za_instytucja <- marc_field_245 %>%
  select(ZA_UWAGI,X245c=`$c`) %>%
  filter(!is.na(X245c)) %>%
  mutate(instytucja = ifelse(grepl("\\;",X245c),str_replace_all(X245c, "(.*?)(\\;(?!.*\\;))( )+(.*?$)","\\4"),"")) %>%
  left_join(.,BN_wspoltworca,by="ZA_UWAGI")

x <- 1:lengths(za_instytucja[1])
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  za_instytucja$czy_nazwisko[i] <- grepl(za_instytucja$OS_NAZWISKO[i],za_instytucja$X245c[i])
  za_instytucja$czy_imie[i] <- grepl(za_instytucja$OS_IMIE[i],za_instytucja$X245c[i])
}
Progress:  1 on 27  Progress:  2 on 27  Progress:  3 on 27  Progress:  4 on 27  Progress:  5 on 27  Progress:  6 on 27  Progress:  7 on 27  Progress:  8 on 27  Progress:  9 on 27  Progress: 10 on 27  Progress: 11 on 27  Progress: 12 on 27  Progress: 13 on 27  Progress: 14 on 27  Progress: 15 on 27  Progress: 16 on 27  Progress: 17 on 27  Progress: 18 on 27  Progress: 19 on 27  Progress: 20 on 27  Progress: 21 on 27  Progress: 22 on 27  Progress: 23 on 27  Progress: 24 on 27  Progress: 25 on 27  Progress: 26 on 27  Progress: 27 on 27  
za_instytucja <- za_instytucja %>%
  filter(is.na(czy_nazwisko)&is.na(czy_imie)) %>%
  filter(instytucja!="") %>%
  filter(!grepl("^\\[[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]|^[a-zaáàâãäăāåąæeéèêëěēėęiíìîïīįioóòôõöőøœuúùûüűūůyýcćčçdďđđgģğkķlłļnńñňņŋrřsśšşsßtťŧþţzżźž]",instytucja)) %>%
  mutate(instytucja = str_remove(instytucja,"\\.$")) %>%
  select(ZA_UWAGI,instytucja) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")

#10: wydawnictwo
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI, X260) %>%
  mutate(X260 = str_replace_all(X260,"s\\.n\\.", "b.w."), 
         X260 = str_replace_all(X260,"s\\.l\\.", "b.m."), 
         X260 = str_replace_all(X260,"S\\.l\\.", "b.m."), 
         X260 = str_remove(X260,"^\\\\+"), 
         rok_wydania = str_extract_all(X260, "(?<=\\$c).*(?=\\$e)|(?<=\\$c).*"), 
         bez_roku = str_replace_all(X260, ".\\$c.*", ""), 
         ile_wydawnictw = str_count(bez_roku, "\\$b"),
         ile_miejsc = str_count(bez_roku, "\\$a"),
         kolejnosc = str_replace_all(as.character(str_extract_all(bez_roku, "\\$.")), "[^a-z]", ""),
         bez_roku = str_replace_all(bez_roku, ";\\$b", ":$b"),
         wydaw_podziel = ifelse(ile_wydawnictw>ile_miejsc|kolejnosc=="caabb", str_replace_all(bez_roku, "(\\$a)(.*?)( :\\$b.*?)( :\\$b)", "\\1\\2\\3 ;$a\\2\\4"),bez_roku),
         wydawnictwo_test = str_replace_all(wydaw_podziel, "(\\$b)(.*?)( ;\\$a)", "\\1\\2|\\3")) %>%
  select(ZA_UWAGI,rok_wydania,wydawnictwo_test) %>%
  cSplit(., "wydawnictwo_test", sep = "|", direction = "long") %>%
  mutate(wydawnictwo = str_extract_all(wydawnictwo_test, "(?<=\\$b)(.*)"),
         miejsce_wydania = str_replace_all(str_extract_all(wydawnictwo_test, "(?<=\\$a)(.*)(?= {0,1}: {0,1}\\$b)|(?<=\\$a)(.*)($)")," ;\\$a", ", "),
         nazwa_prosta = str_to_lower(str_replace_all(str_replace_all(unlist(wydawnictwo_test), "\\$\\w", ""), "\\W", ""))) %>%
  left_join(.,PBL_wydawnictwa,by="nazwa_prosta") %>%
  mutate(to_samo = wydawnictwo==WY_NAZWA) %>%
  arrange(ZA_UWAGI,-to_samo,-WY_LICZBA_ZAPISOW)
BN_wydawnictwo$id_grupy <- cumsum(!duplicated(BN_wydawnictwo[1:3]))
BN_wydawnictwo <- BN_wydawnictwo[!duplicated(BN_wydawnictwo$id_grupy),] %>%
  mutate(WY_NAZWA = ifelse(!is.na(WY_NAZWA),as.character(WY_NAZWA),as.character(wydawnictwo)),
         WY_MIASTO = ifelse(!is.na(WY_MIASTO),as.character(WY_MIASTO),trim(as.character(miejsce_wydania))),
         rok_wydania = str_replace_all(rok_wydania, "(.*)(\\.)", "\\1"),
         za_rok_wydania = ifelse(nchar(rok_wydania)==4,as.character(rok_wydania),NA),
         do_opisu = ifelse(is.na(za_rok_wydania),paste("[",str_extract(rok_wydania,"\\d{4}"),"]",sep = ""),""),
         WY_MIASTO = ifelse(substr(WY_MIASTO,1,1)=="["&substr(WY_MIASTO,nchar(WY_MIASTO),nchar(WY_MIASTO))!="]"&is.na(WY_WYDAWNICTWO_ID),paste(trim(WY_MIASTO),"]",sep = ""),as.character(WY_MIASTO))) %>%
  select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania,do_opisu) %>% 
  mutate(WY_NAZWA = ifelse(str_count(WY_NAZWA, "\\[")>str_count(WY_NAZWA, "\\]"), paste(WY_NAZWA, "]", sep = ""),
                           ifelse(str_count(WY_NAZWA, "\\[")<str_count(WY_NAZWA, "\\]"), paste("[", WY_NAZWA, sep = ""), as.character(WY_NAZWA))),
         WY_MIASTO = ifelse(str_count(WY_MIASTO, "\\[")>str_count(WY_MIASTO, "\\]"), paste(WY_MIASTO, "]", sep = ""),
                           ifelse(str_count(WY_MIASTO, "\\[")<str_count(WY_MIASTO, "\\]"), paste("[", WY_MIASTO, sep = ""), as.character(WY_MIASTO))))

#11: opis fizyczny książki
#pole 300 do opisu fizycznego
marc_field_300 <- data %>%
  select(ZA_UWAGI,X300)%>%
  filter(X300!="") %>%
  mutate(X300=str_replace_all(X300,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X300",sep = "~",direction = "long") %>%
  filter(X300!="") %>%
  mutate(X300=str_remove_all(X300,"^\\|")) %>%
  mutate(indicator = str_replace_all(X300,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X300,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_300)[1]))
colnames(empty_table) <-subfield_list
marc_field_300<-cbind(marc_field_300,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_300$X300 <- str_replace(marc_field_300$X300,subfield_list_char[i],"|\\1")
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_300[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_300$X300),str_replace_all(gsub(string,"\\3",marc_field_300$X300),"\\${2}.", "~"),NA)
}
Progress: 1 on 3  Progress: 2 on 3  Progress: 3 on 3  
if("$e" %in% colnames(marc_field_300)) {
marc_field_300 <- marc_field_300 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$b` = str_remove(`$b`," \\;+$| \\:+$"),
         `$e` = ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`)&grepl("\\+ dysk|płyt",`$e`),str_extract(`$e`,"(?<=\\+)(dysk|płyt.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),
                       ifelse(grepl("CD-ROM|DVD|VCD|CD",`$e`),str_extract(`$e`,"(^.*?)(CD-ROM|DVD|VCD|CD)(\\)){0,1}"),NA)),
         `$a` = ifelse(is.na(`$a`),"",as.character(`$a`)),
         `$b` = ifelse(is.na(`$b`),"",as.character(`$b`)),
         `$e` = ifelse(is.na(`$e`),"",as.character(`$e`)))
} else {
  marc_field_300 <- marc_field_300 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$b` = str_remove(`$b`," \\;+$| \\:+$"),
         `$a` = ifelse(is.na(`$a`),"",as.character(`$a`)),
         `$b` = ifelse(is.na(`$b`),"",as.character(`$b`)))
}
#pole 500 do opisu fizycznego
marc_field_500 <- data %>%
  select(ZA_UWAGI,X500)%>%
  filter(X500!="") %>%
  mutate(X500=str_replace_all(X500,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X500",sep = "~",direction = "long") %>%
  filter(X500!="") %>%
  mutate(X500=str_remove_all(X500,"^\\|")) %>%
  mutate(indicator = str_replace_all(X500,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X500,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_500)[1]))
colnames(empty_table) <-subfield_list
marc_field_500<-cbind(marc_field_500,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_500$X500 <- str_replace(marc_field_500$X500,subfield_list_char[i],"|\\1")
}
Progress: 1 on 1  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_500[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_500$X500),str_replace_all(gsub(string,"\\3",marc_field_500$X500),"\\${2}.", "~"),NA)
}
Progress: 1 on 1  
marc_field_500 <- marc_field_500 %>%
  mutate(`$a` = ifelse(grepl("oryg(\\.|\\,)",X500)&grepl("pseud|nazwa",X500,ignore.case = TRUE),str_replace(`$a`,"(^.*?)(\\. )(\\p{Lu}.*$)","\\3"),as.character(`$a`))) %>% 
  filter(!grepl("oryg(\\.|\\,)",`$a`)&grepl("pseud|nazwa|dotycz|pol",`$a`,ignore.case = TRUE)) %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))
  
#pole 546 do opisu fizycznego
marc_field_546 <- data %>%
  select(ZA_UWAGI,X546)%>%
  filter(X546!="")

if (nrow(marc_field_546) != 0){
marc_field_546 <- marc_field_546 %>%
  mutate(X546=str_replace_all(X546,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X546",sep = "~",direction = "long") %>%
  filter(X546!="") %>%
  mutate(X546=str_remove_all(X546,"^\\|")) %>%
  mutate(indicator = str_replace_all(X546,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X546,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_546)[1]))
colnames(empty_table) <-subfield_list
marc_field_546<-cbind(marc_field_546,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_546$X546 <- str_replace(marc_field_546$X546,subfield_list_char[i],"|\\1")
}
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_546[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_546$X546),str_replace_all(gsub(string,"\\3",marc_field_546$X546),"\\${2}.", "~"),NA)
}
marc_field_546 <- marc_field_546 %>%
  mutate(`$a` = str_remove(`$a`," \\;+$| \\:+$"))
} else {
  marc_field_546 <- data.frame(ZA_UWAGI = "", X546 = "", indicator = "", stringsAsFactors = FALSE) %>% 
    mutate(`$a` = "")
}
Progress: 1 on 1  Progress: 1 on 1  
if("$e" %in% colnames(marc_field_300)) {
za_opis_ks <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,do_opisu),by="ZA_UWAGI") %>%
  left_join(.,marc_field_300 %>% select(ZA_UWAGI,X300a=`$a`,X300b=`$b`,X300e=`$e`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_500 %>% select(ZA_UWAGI,X500a=`$a`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_546 %>% select(ZA_UWAGI,X546a=`$a`),by="ZA_UWAGI")
za_opis_ks[is.na(za_opis_ks)]  <- ""
za_opis_ks <- za_opis_ks %>%
  mutate(za_opis_ks = paste(ifelse(do_opisu!="",paste(as.character(do_opisu),", ",sep = ""),""),ifelse(X300a!="",paste(as.character(X300a),", ",sep = ""),""),ifelse(X300b!="",paste(as.character(X300b),", ",sep = ""),""),ifelse(X300e!="",paste(as.character(X300e),", ",sep = ""),""),ifelse(X500a!="",paste(as.character(X500a),", ",sep = ""),""),ifelse(X546a!="",as.character(X546a),""),sep = ""),
         za_opis_ks = str_remove(za_opis_ks,"(, )+$")) %>%
  select(ZA_UWAGI,za_opis_ks) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(za_opis_ks))
} else {
  za_opis_ks <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,do_opisu),by="ZA_UWAGI") %>%
  left_join(.,marc_field_300 %>% select(ZA_UWAGI,X300a=`$a`,X300b=`$b`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_500 %>% select(ZA_UWAGI,X500a=`$a`),by="ZA_UWAGI") %>%
  left_join(.,marc_field_546 %>% select(ZA_UWAGI,X546a=`$a`),by="ZA_UWAGI")
za_opis_ks[is.na(za_opis_ks)]  <- ""
za_opis_ks <- za_opis_ks %>%
  mutate(za_opis_ks = paste(ifelse(do_opisu!="",paste(as.character(do_opisu),", ",sep = ""),""),ifelse(X300a!="",paste(as.character(X300a),", ",sep = ""),""),ifelse(X300b!="",paste(as.character(X300b),", ",sep = ""),""),ifelse(X500a!="",paste(as.character(X500a),", ",sep = ""),""),ifelse(X546a!="",as.character(X546a),""),sep = ""),
         za_opis_ks = str_remove(za_opis_ks,"(, )+$")) %>%
  select(ZA_UWAGI,za_opis_ks) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(za_opis_ks))
}
za_opis_ks$id_grupy <- cumsum(!duplicated(za_opis_ks[1]))
za_opis_ks <- za_opis_ks[!duplicated(za_opis_ks$id_grupy),] %>%
  select(-id_grupy)

wsp_info <- za_opis_ks %>% 
  left_join(tytul_wspolwydanie,by="ZA_UWAGI") %>% 
  left_join(BN_autor,by="ZA_UWAGI") %>% 
  mutate(wsp = paste("[Współwyd.: ",ifelse(AM_IMIE=="*","",AM_IMIE)," ",AM_NAZWISKO,": ",ZA_TYTUL,"]", sep = ""),
         za_uwagi2 = str_remove_all(ZA_UWAGI,".$"))

wsp_info %$%  
    { za_uwagi2 == dplyr::lag(za_uwagi2, 1)} %>% 
    as.numeric() %>% 
    {.} -> wsp_info$same
wsp_info$same[1] <- 0

wsp_info <- wsp_info %>% 
  arrange(za_uwagi2,-same)

za_opis_ks <- za_opis_ks %>% 
  bind_cols(wsp_info %>% select(wsp)) %>% 
  unite("za_opis_ks",za_opis_ks:wsp,remove = TRUE,sep = " ")

#12: seria wydawnicza
marc_field_490 <- data %>%
  select(ZA_UWAGI,X490,X800,X830) %>%
  mutate(X490 = ifelse(grepl("U\\+",X490),as.character(X830),as.character(X490))) %>%
  mutate(X800 = ifelse(X490!="","",as.character(X800)),
         X830 = ifelse(X490!="","",as.character(X830)),
         X800 = str_replace(X800,"(\\$a)(.*)(\\$t)","\\1"),
         X490 = ifelse(X490==""&X830!="",as.character(X830),
                       ifelse(X490==""&X800!="",as.character(X800),as.character(X490)))) %>%
  select(ZA_UWAGI,X490) %>%
  filter(X490!="") %>%
  mutate(X490=str_replace_all(X490,"(^|\\|)","~\\1")) %>%
  cSplit(.,"X490",sep = "~",direction = "long") %>%
  filter(X490!="") %>%
  mutate(X490=str_remove_all(X490,"^\\|")) %>%
  mutate(indicator = str_replace_all(X490,"(^.*?)(\\$.*)","\\1"))
subfield_list<- str_extract_all(data$X490,"\\$.")
subfield_list<- unique(unlist(subfield_list))
empty_table<- data.frame(matrix(ncol = length(subfield_list),nrow = lengths(marc_field_490)[1]))
colnames(empty_table) <-subfield_list
marc_field_490<-cbind(marc_field_490,empty_table)
subfield_list_char <- paste("(",subfield_list,")",sep = "")
subfield_list_char <- str_replace_all(subfield_list_char,"\\$","\\\\$")

x <- 1:length(subfield_list)
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  marc_field_490$X490 <- str_replace(marc_field_490$X490,subfield_list_char[i],"|\\1")
}
Progress: 1 on 2  Progress: 2 on 2  
for (i in x) {
  progress(match(i,x), max.value = length(x)) 
  subfield_list_char2 <- str_replace_all(subfield_list,"\\$","\\\\$")
  string_a <- "(^)(.*?\\|"
  string_b <- subfield_list_char2[i]
  string_c <- ")(.*?)(\\,{0,1})((\\|\\$)(.*)|$)"
  string <- paste(string_a,string_b,string_c,sep = "")
  marc_field_490[,i+3] <- ifelse(grepl(subfield_list_char2[i],marc_field_490$X490),str_replace_all(gsub(string,"\\3",marc_field_490$X490),"\\${2}.", "~"),NA)
}
Progress: 1 on 2  Progress: 2 on 2  
if ("$v" %in% colnames(marc_field_490)){
za_seria_wydawnicza <- marc_field_490 %>%
  mutate(`$a` = str_replace_all(`$a`,"(=)(\\$a)","\\1 "),
         `$a` = str_remove(`$a`," \\;+$| \\:+$"),
         `$v` = ifelse(is.na(`$v`),"",as.character(`$v`))) %>%
  filter(!is.na(`$a`)) %>%
  mutate(seria = str_remove(paste("(",`$a`,"; ",`$v`,")",sep = ""),"; (?=\\)$)"),
         seria = gsub("( : )(.)",". \\U\\2",perl=TRUE,seria)) %>%
  select(ZA_UWAGI,seria) %>%
  group_by(ZA_UWAGI) %>%
  mutate(seria = paste(seria,collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(seria = str_replace_all(seria,"\\$.","; ")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")
} else {
  za_seria_wydawnicza <- marc_field_490 %>%
  mutate(`$a` = str_replace_all(`$a`,"(=)(\\$a)","\\1 "),
         `$a` = str_remove(`$a`," \\;+$| \\:+$")) %>%
  filter(!is.na(`$a`)) %>%
  mutate(seria = str_remove(paste("(",`$a`,")",sep = ""),"; (?=\\)$)"),
         seria = gsub("( : )(.)",". \\U\\2",perl=TRUE,seria)) %>%
  select(ZA_UWAGI,seria) %>%
  group_by(ZA_UWAGI) %>%
  mutate(seria = paste(seria,collapse = " ")) %>%
  ungroup() %>%
  unique() %>%
  mutate(seria = str_replace_all(seria,"\\$.","; ")) %>%
  right_join(.,data %>% select(ZA_UWAGI),by="ZA_UWAGI")
}

#13: tomy
za_tomy <- data %>%
  select(ZA_UWAGI) %>%
  mutate(za_tomy = NA)

#14: adnotacje
za_adnotacje <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_autor %>% select(ZA_UWAGI,ZA_ADNOTACJE),by="ZA_UWAGI") %>%
  mutate(ZA_ADNOTACJE = ifelse(is.na(ZA_ADNOTACJE),"",paste(as.character(ZA_ADNOTACJE),"# ",sep = "")),
         ZA_ADNOTACJE = str_remove(ZA_ADNOTACJE,"(# )+$")) %>%
  select(ZA_UWAGI,ZA_ADNOTACJE) %>%
  unique() %>%
  arrange(ZA_UWAGI,-nchar(ZA_ADNOTACJE))
za_adnotacje$id_grupy <- cumsum(!duplicated(za_adnotacje[1]))
za_adnotacje <- za_adnotacje[!duplicated(za_adnotacje$id_grupy),] %>%
  select(-id_grupy)

#15: BN_URL
BN_URL <- data %>%
  select(ZA_UWAGI,BN_URL)

#wyrównanie liczby wierszy do liczby wierszy obiektu data
BN_autor <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_autor %>% select(ZA_UWAGI,AM_AUTOR_ID,AM_NAZWISKO,AM_IMIE),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, AM_AUTOR_ID = paste(AM_AUTOR_ID, collapse="|"), AM_NAZWISKO = paste(AM_NAZWISKO, collapse="|"), AM_IMIE = paste(AM_IMIE, collapse="|"))
BN_wspoltworca <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wspoltworca %>% select(ZA_UWAGI,OS_OSOBA_ID,OS_NAZWISKO,OS_IMIE,fo_symbol),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, OS_OSOBA_ID = paste(OS_OSOBA_ID, collapse="|"), OS_NAZWISKO = paste(OS_NAZWISKO, collapse="|"), OS_IMIE = paste(OS_IMIE, collapse="|"), fo_symbol = paste(fo_symbol, collapse="|")) %>%
  mutate(fo_symbol = ifelse(fo_symbol=="NULL","NA",as.character(fo_symbol)))
BN_wydawnictwo <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,BN_wydawnictwo %>% select(ZA_UWAGI,WY_WYDAWNICTWO_ID,WY_NAZWA,WY_MIASTO,za_rok_wydania),by="ZA_UWAGI") %>%
  ddply(., .(ZA_UWAGI), summarize, WY_WYDAWNICTWO_ID = paste(WY_WYDAWNICTWO_ID, collapse="|"), WY_NAZWA = paste(WY_NAZWA, collapse="|"), WY_MIASTO = paste(WY_MIASTO, collapse="|"), za_rok_wydania = paste(unique(za_rok_wydania), collapse="|")) %>%
  mutate(za_rok_wydania = ifelse(za_rok_wydania=="NA","",as.integer(za_rok_wydania)))
pojawi戼㸳y si攼㹡 warto㤼㹣ci NA na skutek przekszta戼㸳cenia
#połączenie wszystkich elementów w jedną tabelę
kolejnosc <- data.frame(kolejnosc=c("ZA_UWAGI","RZ_NAZWA","ZA_RO_ROK","ZA_TYPE","RZ_RODZAJ_ID","DZ_NAZWA","DZ_DZIAL_ID","TW_TWORCA_ID","AM_AUTOR_ID","AM_NAZWISKO","AM_IMIE","ZA_TYTUL","ZA_TYTUL_ORYGINALU","ZA_JEZYK_ORYGINALU","OS_OSOBA_ID","OS_NAZWISKO","OS_IMIE","fo_symbol","za_opis_wspoltworcow","wydanie","za_tomy","instytucja","WY_WYDAWNICTWO_ID","WY_MIASTO","WY_NAZWA","za_rok_wydania","za_opis_ks","seria","TW_NAZWISKO","TW_IMIE","redaktor_dzialu","ZA_ADNOTACJE","BN_URL"))
polaczone <- data %>%
  select(ZA_UWAGI) %>%
  left_join(.,pola_pbl,by = "ZA_UWAGI") %>%
  left_join(.,BN_autor,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul,by = "ZA_UWAGI") %>%
  left_join(.,za_tytul_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,za_jezyk_oryginalu,by = "ZA_UWAGI") %>%
  left_join(.,BN_wspoltworca,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_wspoltworcow,by = "ZA_UWAGI") %>%
  left_join(.,za_wydanie,by = "ZA_UWAGI") %>%
  left_join(.,za_instytucja,by = "ZA_UWAGI") %>%
  left_join(.,BN_wydawnictwo,by = "ZA_UWAGI") %>%
  left_join(.,za_opis_ks,by = "ZA_UWAGI") %>%
  left_join(.,za_seria_wydawnicza,by = "ZA_UWAGI") %>%
  left_join(.,za_tomy,by = "ZA_UWAGI") %>%
  left_join(.,za_adnotacje,by = "ZA_UWAGI") %>%
  left_join(.,BN_URL,by = "ZA_UWAGI") %>%
  select(as.vector(kolejnosc$kolejnosc))
colnames(polaczone) <- c("rekord_BN","rz_nazwa","za_ro_rok","za_type","rz_rodzaj_id","DZ_NAZWA","DZ_DZIAL_ID","tw_tworca_id","am_autor_id","am_nazwisko","am_imie","za_tytul","za_tytul_oryginalu","za_jezyk_oryginalu","os_osoba_id","os_nazwisko","os_imie","fo_symbol","za_opis_wspoltworcow","za_wydanie","za_tomy","za_instytucja","wy_wydawnictwo_id","wy_miejsce","wy_nazwa","za_rok_wydania","za_opis_fizyczny_ksiazki","za_seria_wydawnicza","tw_nazwisko","tw_imie","pracownik","za_adnotacje","BN_URL")

#zasygnalizowanie niepoprawnego kodowania
x <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("<U\\+(....)>",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)!=0,paste(polaczone$za_adnotacje,paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole.",sep = ""),sep = "# "),paste("UWAGA! Błąd kodowania w polu ",as.character(names(polaczone[i]))," Znajdź frazę \"???\" i zredaguj pole.",sep = "")),as.character(polaczone$za_adnotacje))
  polaczone[,i] <- gsub("<U\\+(....)>", "???", polaczone[,i])
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności znaku $ w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("\\$",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano znak \"$\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności frazy "character(0)" w którymś z pól
X <- 1:(length(polaczone)-2)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  polaczone$za_adnotacje <- ifelse(grepl("character\\(0\\)",polaczone[,i]),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),paste(polaczone$za_adnotacje,paste("UWAGA! Ze względu na błędny zapis BN w polu ",as.character(names(polaczone[i]))," wydrukowano frazę \"character(0)\". Zredaguj treść pola.",sep = ""),sep = "# ")),as.character(polaczone$za_adnotacje))
}
Progress:  1 on 31  Progress:  2 on 31  Progress:  3 on 31  Progress:  4 on 31  Progress:  5 on 31  Progress:  6 on 31  Progress:  7 on 31  Progress:  8 on 31  Progress:  9 on 31  Progress: 10 on 31  Progress: 11 on 31  Progress: 12 on 31  Progress: 13 on 31  Progress: 14 on 31  Progress: 15 on 31  Progress: 16 on 31  Progress: 17 on 31  Progress: 18 on 31  Progress: 19 on 31  Progress: 20 on 31  Progress: 21 on 31  Progress: 22 on 31  Progress: 23 on 31  Progress: 24 on 31  Progress: 25 on 31  Progress: 26 on 31  Progress: 27 on 31  Progress: 28 on 31  Progress: 29 on 31  Progress: 30 on 31  Progress: 31 on 31  
#zasygnalizowanie obecności znaku # w opisie współtwórców
polaczone$za_adnotacje <- ifelse(grepl("\\#",polaczone$za_opis_wspoltworcow),
                                   ifelse(nchar(polaczone$za_adnotacje)==0,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności \"#\" współtwórcy z pola 700).",paste(polaczone$za_adnotacje,"UWAGA! Ze względu na konflikt w opisie współtwórców wybierz właściwą wartość (strefa odpowiedzialności # współtwórcy z pola 700).",sep = "# ")),as.character(polaczone$za_adnotacje))

out <- cSplit(polaczone, c("am_autor_id", "am_nazwisko", "am_imie","os_osoba_id","os_nazwisko", "os_imie", "fo_symbol","wy_wydawnictwo_id","wy_miejsce","wy_nazwa"),sep = "|",direction = "long") %>%
  unique()

out$rekord_BN <- ifelse(is.na(out$rekord_BN),'',as.character(out$rekord_BN))
out$rz_nazwa <- ifelse(is.na(out$rz_nazwa),'',as.character(out$rz_nazwa))
out$za_ro_rok <- ifelse(is.na(out$za_ro_rok),'',as.character(out$za_ro_rok))
out$za_type <- ifelse(is.na(out$za_type),'',as.character(out$za_type))
out$rz_rodzaj_id <- ifelse(is.na(out$rz_rodzaj_id),'',as.character(out$rz_rodzaj_id))
out$DZ_NAZWA <- ifelse(is.na(out$DZ_NAZWA),'',as.character(out$DZ_NAZWA))
out$DZ_DZIAL_ID <- ifelse(is.na(out$DZ_DZIAL_ID),'',as.character(out$DZ_DZIAL_ID))
out$tw_tworca_id <- ifelse(is.na(out$tw_tworca_id),'',as.character(out$tw_tworca_id))
out$am_autor_id <- ifelse(is.na(out$am_autor_id),'',as.character(out$am_autor_id))
out$am_nazwisko <- ifelse(is.na(out$am_nazwisko),'',as.character(out$am_nazwisko))
out$am_imie <- ifelse(is.na(out$am_imie),'',as.character(out$am_imie))
out$za_tytul <- ifelse(is.na(out$za_tytul),'',as.character(out$za_tytul))
out$za_tytul_oryginalu <- ifelse(is.na(out$za_tytul_oryginalu),'',as.character(out$za_tytul_oryginalu))
out$za_jezyk_oryginalu <- ifelse(is.na(out$za_jezyk_oryginalu),'',as.character(out$za_jezyk_oryginalu))
out$os_osoba_id <- ifelse(is.na(out$os_osoba_id),'',as.character(out$os_osoba_id))
out$os_nazwisko <- ifelse(is.na(out$os_nazwisko),'',as.character(out$os_nazwisko))
out$os_imie <- ifelse(is.na(out$os_imie),'',as.character(out$os_imie))
out$fo_symbol <- ifelse(is.na(out$fo_symbol),'',as.character(out$fo_symbol))
out$za_opis_wspoltworcow <- ifelse(is.na(out$za_opis_wspoltworcow),'',as.character(out$za_opis_wspoltworcow))
out$za_wydanie <- ifelse(is.na(out$za_wydanie),'',as.character(out$za_wydanie))
out$za_tomy <- ifelse(is.na(out$za_tomy),'',as.character(out$za_tomy))
out$za_instytucja <- ifelse(is.na(out$za_instytucja),'',as.character(out$za_instytucja))
out$wy_wydawnictwo_id <- ifelse(is.na(out$wy_wydawnictwo_id),'',as.character(out$wy_wydawnictwo_id))
out$wy_miejsce <- ifelse(is.na(out$wy_miejsce),'',as.character(out$wy_miejsce))
out$wy_nazwa <- ifelse(is.na(out$wy_nazwa),'',as.character(out$wy_nazwa))
out$za_rok_wydania <- ifelse(is.na(out$za_rok_wydania),'',as.character(out$za_rok_wydania))
out$za_opis_fizyczny_ksiazki <- ifelse(is.na(out$za_opis_fizyczny_ksiazki),'',as.character(out$za_opis_fizyczny_ksiazki))
out$za_seria_wydawnicza <- ifelse(is.na(out$za_seria_wydawnicza),'',as.character(out$za_seria_wydawnicza))
out$tw_nazwisko <- ifelse(is.na(out$tw_nazwisko),'',as.character(out$tw_nazwisko))
out$tw_imie <- ifelse(is.na(out$tw_imie),'',as.character(out$tw_imie))
out$pracownik <- ifelse(is.na(out$pracownik),'',as.character(out$pracownik))
out$za_adnotacje <- ifelse(is.na(out$za_adnotacje),'',as.character(out$za_adnotacje))
out$BN_URL <- ifelse(is.na(out$BN_URL),'',as.character(out$BN_URL))

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same
out$same[1] <- 0
out$dzielone <- paste(out$am_autor_id,out$am_nazwisko,out$am_imie,out$os_osoba_id,out$os_nazwisko,out$os_imie,out$fo_symbol,out$wy_wydawnictwo_id,out$wy_miejsce,out$wy_nazwa,sep = "")

out <- out %>%
  filter(!(same==1&dzielone=="")) %>%
  select(1:33)

out %$%  
    { rekord_BN==lag(rekord_BN,) & rz_nazwa==lag(rz_nazwa,) & za_ro_rok==lag(za_ro_rok,) & za_type==lag(za_type,) & rz_rodzaj_id==lag(rz_rodzaj_id,) & DZ_NAZWA==lag(DZ_NAZWA,) & DZ_DZIAL_ID==lag(DZ_DZIAL_ID,) & tw_tworca_id==lag(tw_tworca_id,) & za_tytul==lag(za_tytul,) & za_tytul_oryginalu==lag(za_tytul_oryginalu,) & za_jezyk_oryginalu==lag(za_jezyk_oryginalu,) & za_opis_wspoltworcow==lag(za_opis_wspoltworcow,) & za_wydanie==lag(za_wydanie,) & za_tomy==lag(za_tomy,) & za_instytucja==lag(za_instytucja,) & za_rok_wydania==lag(za_rok_wydania,) & za_opis_fizyczny_ksiazki==lag(za_opis_fizyczny_ksiazki,) & za_seria_wydawnicza==lag(za_seria_wydawnicza,) & tw_nazwisko==lag(tw_nazwisko,) & tw_imie==lag(tw_imie,) & pracownik==lag(pracownik,) & za_adnotacje==lag(za_adnotacje,) & BN_URL==lag(BN_URL,)} %>% 
    as.numeric() %>% 
    {.} -> out$same

#ucięcie zbyt długich ciągów znaków, by weszły do oracle'a
dlugosci <- data.frame(pole = c("am_nazwisko", "am_imie", "za_tytul", "za_tytul_oryginalu", "za_jezyk_oryginalu", "os_nazwisko", "os_imie", "za_opis_wspoltworcow", "za_instytucja", "wy_miejsce", "wy_nazwa", "za_opis_fizyczny_ksiazki", "za_seria_wydawnicza", "tw_nazwisko", "tw_imie", "za_adnotacje"), liczba_znakow = c(50,40,500,500,100,50,40,500,255,40,255,1000,255,200,40,2000))
x <- match(dlugosci$pole,names(out))
for (i in x) {
  progress(match(i,x), max.value = length(x))
  dlugosc <- dlugosci$liczba_znakow[match(names(out[i]),dlugosci$pole)]
  out$za_adnotacje <- ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje!="",paste(out$za_adnotacje,paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),sep = "# "),
                             ifelse(dlugosc<nchar(as.character(out[,i]))&out$za_adnotacje=="",paste("UWAGA! Pole ",as.character(names(out[i]))," było zbyt długie i zostało przycięte. Zredaguj treść pola.",sep = ""),as.character(out$za_adnotacje)))
  
  out[,i] <- ifelse(dlugosc<nchar(as.character(out[,i])),as.character(substr(out[,i],1,dlugosc)),as.character(out[,i]))
}
Progress:  1 on 16  Progress:  2 on 16  Progress:  3 on 16  Progress:  4 on 16  Progress:  5 on 16  Progress:  6 on 16  Progress:  7 on 16  Progress:  8 on 16  Progress:  9 on 16  Progress: 10 on 16  Progress: 11 on 16  Progress: 12 on 16  Progress: 13 on 16  Progress: 14 on 16  Progress: 15 on 16  Progress: 16 on 16  
out$rekord_BN[out$same == 1] <- ""
out$rz_nazwa[out$same == 1] <- ""
out$za_ro_rok[out$same == 1] <- ""
out$za_type[out$same == 1] <- ""
out$rz_rodzaj_id[out$same == 1] <- ""
out$DZ_NAZWA[out$same == 1] <- ""
out$DZ_DZIAL_ID[out$same == 1] <- ""
out$tw_tworca_id[out$same == 1] <- ""
out$za_tytul[out$same == 1] <- ""
out$za_tytul_oryginalu[out$same == 1] <- ""
out$za_jezyk_oryginalu[out$same == 1] <- ""
out$za_opis_wspoltworcow[out$same == 1] <- ""
out$za_wydanie[out$same == 1] <- ""
out$za_tomy[out$same == 1] <- ""
out$za_instytucja[out$same == 1] <- ""
out$za_rok_wydania[out$same == 1] <- ""
out$za_opis_fizyczny_ksiazki[out$same == 1] <- ""
out$za_seria_wydawnicza[out$same == 1] <- ""
out$tw_nazwisko[out$same == 1] <- ""
out$tw_imie[out$same == 1] <- ""
out$pracownik[out$same == 1] <- ""
out$za_adnotacje[out$same == 1] <- ""
out$BN_URL[out$same == 1] <- ""

out <- out %>%
  select(1:33)

#pętla zapisująca po ok. 2000 wierszy z uwzględnieniem kompletności rekordów bibliograficznych rozpisanych na kilka wierszy
out <- out %>%
  mutate(podzial = ifelse(rekord_BN!="",as.character(rekord_BN),NA)) %>%
  fill(podzial)
ile <- unique(out$podzial)
ile <- split(unique(ile), ceiling(seq_along(unique(ile))/1500))
x <- 1:length(ile)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  final <- out %>%
    filter(podzial %in% ile[[i]]) %>%
    select(-podzial)
  write.xlsx(final, paste("C:/Users/",employee_name,"/Desktop/",import_year,"_wspolwydanie_do_importu",i,".xlsx",sep = ""),sheetName = "gotowe")
}
Progress: 1 on 1  

bezpiecznik UWAGA! Najpierw należy przeprowadzić import do bazy, a następnie egzekwować poniższą część kodu

#w formularzu książkowym wyszukaj w polu uwag frazę '%akceptuje:NA%' i - jeśli takowa wystąpi - zastąp NA imieniem właściwego pracownika
#wiem, że to skasowaliśmy, ale doszedłem do wniosku, że jednak warto to sprawdzić
#automatyczny IOK dla rekordów bibliograficznych

nadpisanie_zapisow_IOK <- read.csv2(paste("C:/Users/",employee_name,"/Desktop/imp_",import_year,"_automatyczne_podmiotowe.csv",sep = ""), encoding = "UTF-8", header = TRUE, stringsAsFactors = FALSE)
Komunikaty ostrzegawcze:
1: Unknown or uninitialised column: 'drugi_autor'. 
2: Unknown or uninitialised column: 'drugi_autor'. 
3: Unknown or uninitialised column: 'drugi_autor'. 
4: Unknown or uninitialised column: 'drugi_autor'. 
5: Unknown or uninitialised column: 'drugi_autor'. 
6: Unknown or uninitialised column: 'drugi_autor'. 
nadpisanie_zapisow_IOK <- nadpisanie_zapisow_IOK %>%
  mutate(rekord_BN = as.character(rekord_BN)) %>% 
  left_join(.,dbGetQuery(PBL,
                             "select z.za_zapis_id, z.za_status_imp, z.za_uwagi
                              from pbl_zapisy z
                              where za_uwagi like 'BN: %'
                              and z.za_url_bn is not null") %>% mutate(ZA_UWAGI = str_extract(ZA_UWAGI,"(?<=BN: )(.*?)(?=, import)")),by=c("rekord_BN"="ZA_UWAGI")) %>%
  #filter(grepl(paste("^BN\\: ",import_year, sep = ""),rekord_BN)) %>% 
  rename(jest = ZA_STATUS_IMP) %>% 
  mutate(ID2 = NA) %>% 
  select(ZA_ZAPIS_ID,ID2,jest,powinno_byc)

write.xlsx(nadpisanie_zapisow_IOK, paste("C:/Users/",employee_name,"/Desktop/",import_year,"_nadpisanie_zapisow_IOK.xlsx",sep = ""),sheetName = "ZA_STATUS_IMP")

#bezpiecznik
#automatyczny IOK dla nowych twórców w kartotece powinien zostać przeprowadzony z poziomu importera

#automatycznie nadpisać rekordy bibliograficzne i kartoteczne przed kolejnym krokiem

#bezpiecznik
#jeśli podczas importu nie da się zaimportować rekordów - wprowadź je ręcznie w tym momencie
#kolumnę BN-URL należy nadpisać automatycznie
#docelowo przygotowujemy plik od razu na dysk, ale na razie xlsx do wgrania na dysk (brak funkcjonalności googlesheets4)
#po tym przygotować na dysku unikatowe linki
bn_ok <- chunk11
Komunikaty ostrzegawcze:
1: Unknown or uninitialised column: 'drugi_autor'. 
2: Unknown or uninitialised column: 'drugi_autor'. 
3: Unknown or uninitialised column: 'drugi_autor'. 
4: Unknown or uninitialised column: 'drugi_autor'. 
5: Unknown or uninitialised column: 'drugi_autor'. 
6: Unknown or uninitialised column: 'drugi_autor'. 
kolejnosc <- c("pracownik","ZA_ZAPIS_ID","typ_ksiazki","link","link_1","rok","status","blad_w_imporcie_tytulu","X100","X245","X650","X655","X246","X250","X260","X300","X380","X490","X500","X501","X546","X600","X700","X041","X080")

rocznik_pbl_po_imporcie <- dbGetQuery(PBL,
                                       "select z.za_zapis_id, z.za_status_imp, z.za_uwagi
                                        from pbl_zapisy z
                                        where za_uwagi like 'BN: %'
                                        and z.za_url_bn is not null") %>% 
  filter(grepl(paste("^BN\\: ",import_year, sep = ""),ZA_UWAGI)) %>% 
  mutate(ZA_UWAGI = str_extract(ZA_UWAGI,"(?<=BN: )(.*?)(?=, import)")) %>%
  rename(status = ZA_STATUS_IMP) %>% 
  left_join(.,bn_ok %>% select(pracownik = redaktor_dzialu,typ_ksiazki = rodzaj_ksiazki,link = BN_URL, rok, X100, X245, X650, X655, X246, X250, X260, X300, X380, X490, X500, X501, X546, X600, X700, X041, X080,ZA_UWAGI) %>% mutate(link_1 = paste("=HYPERLINK(\"",link,"\";\"link do książki w BN\")",sep = ""), blad_w_imporcie_tytulu = FALSE),by="ZA_UWAGI") %>% 
  select(noquote(kolejnosc))
rocznik_pbl_po_imporcie$pracownik[rocznik_pbl_po_imporcie$status=="IOK"] <- "AUTOMAT"

write.xlsx(rocznik_pbl_po_imporcie, paste("C:/Users/",employee_name,"/Desktop/ks_BN_",import_year,"_listy_pracowników.xlsx",sep = ""),sheetName = "lista_ksiazek")
#utwórz nowy podfolder w folderze importu BN i prześlij listę na dysk, przygotuj widoki filtrów dla wszystkich osób i roześlij unikatowe linki
reczne_uzupelnienie <- c(2765929, 3649977, 2786810, 2605520, 3689766, 2823171, 2792556, 2766994, 2634324, 3592064, 3585580, 3613774, 2696408, 3847202, 1971301, 2691380, 3437017, 1174585, 1069065, 3582672, 2768841, 3794149, 2646124, 2654208, 3737322, 3671430, 2557743, 2281148, 3688912, 2319924, 2253422, 2981426, 2506316, 2670050, 2777795, 3689394, 1104406, 3690794, 2593203, 2603250, 3428978, 2647968, 3745919, 1913543, 2672858, 2657360, 3488205, 3689219, 2673127, 3742898, 1113842, 2838554, 2571213, 3080143, 2954229, 3070765, 1263048, 1112879, 3731300, 3643815, 2689671, 2618579, 2821534, 2638139, 2671339, 1834841, 2718281, 2597709, 2981319, 2684222, 2311826, 2752239, 3718134, 2792653, 2686901, 2642331, 3835809, 2617564, 3689166, 2866679, 2845987, 3688926, 3716499, 2636123, 2682447, 3578479, 3641144, 2718274, 3669958, 3718156, 3768850, 3613683, 3719337, 3260494, 2660087, 3689612, 2176545, 1683477, 3626352, "brak danych (CR)", "brak danych (CR)", "brak danych (CR)", "brak danych (CR)", 1000000028663, "brak danych (CR)", 3065133, "brak danych (CR)", "brak danych (CR)", 3092990, 2588979, 3010453, 2609754, 2431531, 2660815, 1187059, 2794040, 2786711)
Było 50 lub więcej ostrzeżeń (użyj 'warnings()' aby zobaczyć pierwsze 50)
pbl_bn_import_fix$id <- reczne_uzupelnienie
pbl_bn_import <- pbl_bn_import %>% 
  bind_rows(pbl_bn_import_fix %>% filter(id != "brak danych (CR)"))

pbl_bn_viaf_import <- data.frame(stringsAsFactors=FALSE)
x <- 1:length(pbl_bn_import$TW_TWORCA_ID)
for (i in x) {
  progress(match(i,x), max.value = length(x))
  name <- paste(str_replace_all(str_remove_all(paste(unlist(jsonlite::fromJSON(paste("https://data.bn.org.pl/api/authorities.json?id=",pbl_bn_import$id[i],sep = "")) %>% .$authorities %>% .$marc %>% .$fields %>% `[[`(1) %>% .$`100` %>% `[[`(3)),collapse = "|"),"\\|NA"),"(\\|)(\\(\\d+)"," \\2"),str_replace_all(str_remove_all(paste(unlist(jsonlite::fromJSON(paste("https://data.bn.org.pl/api/authorities.json?id=",pbl_bn_import$id[i],sep = "")) %>% .$authorities %>% .$marc %>% .$fields %>% `[[`(1) %>% .$`400` %>% `[[`(3)),collapse = "|"),"\\|NA"),"(\\|)(\\(\\.+)"," \\2"),sep = "|")
  viaf <- str_remove_all(paste(unlist(jsonlite::fromJSON(paste("https://data.bn.org.pl/api/authorities.json?id=",pbl_bn_import$id[i],sep = "")) %>% .$authorities %>% .$marc %>% .$fields %>% `[[`(1) %>% .$`024` %>% .$subfields),collapse = "|"),"(\\|NA)|(\\|viaf)")
  iteration <- data.frame(pbl_bn_import %>% select(1:3,5) %>% slice(i), name = name, viaf = viaf)
  pbl_bn_viaf_import <- rbind(pbl_bn_viaf_import,iteration)
}
Progress:    1 on 2548  Progress:    2 on 2548  Progress:    3 on 2548  Progress:    4 on 2548  Progress:    5 on 2548  Progress:    6 on 2548  Progress:    7 on 2548  Progress:    8 on 2548  Progress:    9 on 2548  Progress:   10 on 2548  Progress:   11 on 2548  Progress:   12 on 2548  Progress:   13 on 2548  Progress:   14 on 2548  Progress:   15 on 2548  Progress:   16 on 2548  Progress:   17 on 2548  Progress:   18 on 2548  Progress:   19 on 2548  Progress:   20 on 2548  Progress:   21 on 2548  Progress:   22 on 2548  Progress:   23 on 2548  Progress:   24 on 2548  Progress:   25 on 2548  Progress:   26 on 2548  Progress:   27 on 2548  Progress:   28 on 2548  Progress:   29 on 2548  Progress:   30 on 2548  Progress:   31 on 2548  Progress:   32 on 2548  Progress:   33 on 2548  Progress:   34 on 2548  Progress:   35 on 2548  Progress:   36 on 2548  Progress:   37 on 2548  Progress:   38 on 2548  Progress:   39 on 2548  Progress:   40 on 2548  Progress:   41 on 2548  Progress:   42 on 2548  Progress:   43 on 2548  Progress:   44 on 2548  Progress:   45 on 2548  Progress:   46 on 2548  Progress:   47 on 2548  Progress:   48 on 2548  Progress:   49 on 2548  Progress:   50 on 2548  Progress:   51 on 2548  Progress:   52 on 2548  Progress:   53 on 2548  Progress:   54 on 2548  Progress:   55 on 2548  Progress:   56 on 2548  Progress:   57 on 2548  Progress:   58 on 2548  Progress:   59 on 2548  Progress:   60 on 2548  Progress:   61 on 2548  Progress:   62 on 2548  Progress:   63 on 2548  Progress:   64 on 2548  Progress:   65 on 2548  Progress:   66 on 2548  Progress:   67 on 2548  Progress:   68 on 2548  Progress:   69 on 2548  Progress:   70 on 2548  Progress:   71 on 2548  Progress:   72 on 2548  Progress:   73 on 2548  Progress:   74 on 2548  Progress:   75 on 2548  Progress:   76 on 2548  Progress:   77 on 2548  Progress:   78 on 2548  Progress:   79 on 2548  Progress:   80 on 2548  Progress:   81 on 2548  Progress:   82 on 2548  Progress:   83 on 2548  Progress:   84 on 2548  Progress:   85 on 2548  Progress:   86 on 2548  Progress:   87 on 2548  Progress:   88 on 2548  Progress:   89 on 2548  Progress:   90 on 2548  Progress:   91 on 2548  Progress:   92 on 2548  Progress:   93 on 2548  Progress:   94 on 2548  Progress:   95 on 2548  Progress:   96 on 2548  Progress:   97 on 2548  Progress:   98 on 2548  Progress:   99 on 2548  Progress:  100 on 2548  Progress:  101 on 2548  Progress:  102 on 2548  Progress:  103 on 2548  Progress:  104 on 2548  Progress:  105 on 2548  Progress:  106 on 2548  Progress:  107 on 2548  Progress:  108 on 2548  Progress:  109 on 2548  Progress:  110 on 2548  Progress:  111 on 2548  Progress:  112 on 2548  Progress:  113 on 2548  Progress:  114 on 2548  Progress:  115 on 2548  Progress:  116 on 2548  Progress:  117 on 2548  Progress:  118 on 2548  Progress:  119 on 2548  Progress:  120 on 2548  Progress:  121 on 2548  Progress:  122 on 2548  Progress:  123 on 2548  Progress:  124 on 2548  Progress:  125 on 2548  Progress:  126 on 2548  Progress:  127 on 2548  Progress:  128 on 2548  Progress:  129 on 2548  Progress:  130 on 2548  Progress:  131 on 2548  Progress:  132 on 2548  Progress:  133 on 2548  Progress:  134 on 2548  Progress:  135 on 2548  Progress:  136 on 2548  Progress:  137 on 2548  Progress:  138 on 2548  Progress:  139 on 2548  Progress:  140 on 2548  Progress:  141 on 2548  Progress:  142 on 2548  Progress:  143 on 2548  Progress:  144 on 2548  Progress:  145 on 2548  Progress:  146 on 2548  Progress:  147 on 2548  Progress:  148 on 2548  Progress:  149 on 2548  Progress:  150 on 2548  Progress:  151 on 2548  Progress:  152 on 2548  Progress:  153 on 2548  Progress:  154 on 2548  Progress:  155 on 2548  Progress:  156 on 2548  Progress:  157 on 2548  Progress:  158 on 2548  Progress:  159 on 2548  Progress:  160 on 2548  Progress:  161 on 2548  Progress:  162 on 2548  Progress:  163 on 2548  Progress:  164 on 2548  Progress:  165 on 2548  Progress:  166 on 2548  Progress:  167 on 2548  Progress:  168 on 2548  Progress:  169 on 2548  Progress:  170 on 2548  Progress:  171 on 2548  Progress:  172 on 2548  Progress:  173 on 2548  Progress:  174 on 2548  Progress:  175 on 2548  Progress:  176 on 2548  Progress:  177 on 2548  Progress:  178 on 2548  Progress:  179 on 2548  Progress:  180 on 2548  Progress:  181 on 2548  Progress:  182 on 2548  Progress:  183 on 2548  Progress:  184 on 2548  Progress:  185 on 2548  Progress:  186 on 2548  Progress:  187 on 2548  Progress:  188 on 2548  Progress:  189 on 2548  Progress:  190 on 2548  Progress:  191 on 2548  Progress:  192 on 2548  Progress:  193 on 2548  Progress:  194 on 2548  Progress:  195 on 2548  Progress:  196 on 2548  Progress:  197 on 2548  Progress:  198 on 2548  Progress:  199 on 2548  Progress:  200 on 2548  Progress:  201 on 2548  Progress:  202 on 2548  Progress:  203 on 2548  Progress:  204 on 2548  Progress:  205 on 2548  Progress:  206 on 2548  Progress:  207 on 2548  Progress:  208 on 2548  Progress:  209 on 2548  Progress:  210 on 2548  Progress:  211 on 2548  Progress:  212 on 2548  Progress:  213 on 2548  Progress:  214 on 2548  Progress:  215 on 2548  Progress:  216 on 2548  Progress:  217 on 2548  Progress:  218 on 2548  Progress:  219 on 2548  Progress:  220 on 2548  Progress:  221 on 2548  Progress:  222 on 2548  Progress:  223 on 2548  Progress:  224 on 2548  Progress:  225 on 2548  Progress:  226 on 2548  Progress:  227 on 2548  Progress:  228 on 2548  Progress:  229 on 2548  Progress:  230 on 2548  Progress:  231 on 2548  Progress:  232 on 2548  Progress:  233 on 2548  Progress:  234 on 2548  Progress:  235 on 2548  Progress:  236 on 2548  Progress:  237 on 2548  Progress:  238 on 2548  Progress:  239 on 2548  Progress:  240 on 2548  Progress:  241 on 2548  Progress:  242 on 2548  Progress:  243 on 2548  Progress:  244 on 2548  Progress:  245 on 2548  Progress:  246 on 2548  Progress:  247 on 2548  Progress:  248 on 2548  Progress:  249 on 2548  Progress:  250 on 2548  Progress:  251 on 2548  Progress:  252 on 2548  Progress:  253 on 2548  Progress:  254 on 2548  Progress:  255 on 2548  Progress:  256 on 2548  Progress:  257 on 2548  Progress:  258 on 2548  Progress:  259 on 2548  Progress:  260 on 2548  Progress:  261 on 2548  Progress:  262 on 2548  Progress:  263 on 2548  Progress:  264 on 2548  Progress:  265 on 2548  Progress:  266 on 2548  Progress:  267 on 2548  Progress:  268 on 2548  Progress:  269 on 2548  Progress:  270 on 2548  Progress:  271 on 2548  Progress:  272 on 2548  Progress:  273 on 2548  Progress:  274 on 2548  Progress:  275 on 2548  Progress:  276 on 2548  Progress:  277 on 2548  Progress:  278 on 2548  Progress:  279 on 2548  Progress:  280 on 2548  Progress:  281 on 2548  Progress:  282 on 2548  Progress:  283 on 2548  Progress:  284 on 2548  Progress:  285 on 2548  Progress:  286 on 2548  Progress:  287 on 2548  Progress:  288 on 2548  Progress:  289 on 2548  Progress:  290 on 2548  Progress:  291 on 2548  Progress:  292 on 2548  Progress:  293 on 2548  Progress:  294 on 2548  Progress:  295 on 2548  Progress:  296 on 2548  Progress:  297 on 2548  Progress:  298 on 2548  Progress:  299 on 2548  Progress:  300 on 2548  Progress:  301 on 2548  Progress:  302 on 2548  Progress:  303 on 2548  Progress:  304 on 2548  Progress:  305 on 2548  Progress:  306 on 2548  Progress:  307 on 2548  Progress:  308 on 2548  Progress:  309 on 2548  Progress:  310 on 2548  Progress:  311 on 2548  Progress:  312 on 2548  Progress:  313 on 2548  Progress:  314 on 2548  Progress:  315 on 2548  Progress:  316 on 2548  Progress:  317 on 2548  Progress:  318 on 2548  Progress:  319 on 2548  Progress:  320 on 2548  Progress:  321 on 2548  Progress:  322 on 2548  Progress:  323 on 2548  Progress:  324 on 2548  Progress:  325 on 2548  Progress:  326 on 2548  Progress:  327 on 2548  Progress:  328 on 2548  Progress:  329 on 2548  Progress:  330 on 2548  Progress:  331 on 2548  Progress:  332 on 2548  Progress:  333 on 2548  Progress:  334 on 2548  Progress:  335 on 2548  Progress:  336 on 2548  Progress:  337 on 2548  Progress:  338 on 2548  Progress:  339 on 2548  Progress:  340 on 2548  Progress:  341 on 2548  Progress:  342 on 2548  Progress:  343 on 2548  Progress:  344 on 2548  Progress:  345 on 2548  Progress:  346 on 2548  Progress:  347 on 2548  Progress:  348 on 2548  Progress:  349 on 2548  Progress:  350 on 2548  Progress:  351 on 2548  Progress:  352 on 2548  Progress:  353 on 2548  Progress:  354 on 2548  Progress:  355 on 2548  Progress:  356 on 2548  Progress:  357 on 2548  Progress:  358 on 2548  Progress:  359 on 2548  Progress:  360 on 2548  Progress:  361 on 2548  Progress:  362 on 2548  Progress:  363 on 2548  Progress:  364 on 2548  Progress:  365 on 2548  Progress:  366 on 2548  Progress:  367 on 2548  Progress:  368 on 2548  Progress:  369 on 2548  Progress:  370 on 2548  Progress:  371 on 2548  Progress:  372 on 2548  Progress:  373 on 2548  Progress:  374 on 2548  Progress:  375 on 2548  Progress:  376 on 2548  Progress:  377 on 2548  Progress:  378 on 2548  Progress:  379 on 2548  Progress:  380 on 2548  Progress:  381 on 2548  Progress:  382 on 2548  Progress:  383 on 2548  Progress:  384 on 2548  Progress:  385 on 2548  Progress:  386 on 2548  Progress:  387 on 2548  Progress:  388 on 2548  Progress:  389 on 2548  Progress:  390 on 2548  Progress:  391 on 2548  Progress:  392 on 2548  Progress:  393 on 2548  Progress:  394 on 2548  Progress:  395 on 2548  Progress:  396 on 2548  Progress:  397 on 2548  Progress:  398 on 2548  Progress:  399 on 2548  Progress:  400 on 2548  Progress:  401 on 2548  Progress:  402 on 2548  Progress:  403 on 2548  Progress:  404 on 2548  Progress:  405 on 2548  Progress:  406 on 2548  Progress:  407 on 2548  Progress:  408 on 2548  Progress:  409 on 2548  Progress:  410 on 2548  Progress:  411 on 2548  Progress:  412 on 2548  Progress:  413 on 2548  Progress:  414 on 2548  Progress:  415 on 2548  Progress:  416 on 2548  Progress:  417 on 2548  Progress:  418 on 2548  Progress:  419 on 2548  Progress:  420 on 2548  Progress:  421 on 2548  Progress:  422 on 2548  Progress:  423 on 2548  Progress:  424 on 2548  Progress:  425 on 2548  Progress:  426 on 2548  Progress:  427 on 2548  Progress:  428 on 2548  Progress:  429 on 2548  Progress:  430 on 2548  Progress:  431 on 2548  Progress:  432 on 2548  Progress:  433 on 2548  Progress:  434 on 2548  Progress:  435 on 2548  Progress:  436 on 2548  Progress:  437 on 2548  Progress:  438 on 2548  Progress:  439 on 2548  Progress:  440 on 2548  Progress:  441 on 2548  Progress:  442 on 2548  Progress:  443 on 2548  Progress:  444 on 2548  Progress:  445 on 2548  Progress:  446 on 2548  Progress:  447 on 2548  Progress:  448 on 2548  Progress:  449 on 2548  Progress:  450 on 2548  Progress:  451 on 2548  Progress:  452 on 2548  Progress:  453 on 2548  Progress:  454 on 2548  Progress:  455 on 2548  Progress:  456 on 2548  Progress:  457 on 2548  Progress:  458 on 2548  Progress:  459 on 2548  Progress:  460 on 2548  Progress:  461 on 2548  Progress:  462 on 2548  Progress:  463 on 2548  Progress:  464 on 2548  Progress:  465 on 2548  Progress:  466 on 2548  Progress:  467 on 2548  Progress:  468 on 2548  Progress:  469 on 2548  Progress:  470 on 2548  Progress:  471 on 2548  Progress:  472 on 2548  Progress:  473 on 2548  Progress:  474 on 2548  Progress:  475 on 2548  Progress:  476 on 2548  Progress:  477 on 2548  Progress:  478 on 2548  Progress:  479 on 2548  Progress:  480 on 2548  Progress:  481 on 2548  Progress:  482 on 2548  Progress:  483 on 2548  Progress:  484 on 2548  Progress:  485 on 2548  Progress:  486 on 2548  Progress:  487 on 2548  Progress:  488 on 2548  Progress:  489 on 2548  Progress:  490 on 2548  Progress:  491 on 2548  Progress:  492 on 2548  Progress:  493 on 2548  Progress:  494 on 2548  Progress:  495 on 2548  Progress:  496 on 2548  Progress:  497 on 2548  Progress:  498 on 2548  Progress:  499 on 2548  Progress:  500 on 2548  Progress:  501 on 2548  Progress:  502 on 2548  Progress:  503 on 2548  Progress:  504 on 2548  Progress:  505 on 2548  Progress:  506 on 2548  Progress:  507 on 2548  Progress:  508 on 2548  Progress:  509 on 2548  Progress:  510 on 2548  Progress:  511 on 2548  Progress:  512 on 2548  Progress:  513 on 2548  Progress:  514 on 2548  Progress:  515 on 2548  Progress:  516 on 2548  Progress:  517 on 2548  Progress:  518 on 2548  Progress:  519 on 2548  Progress:  520 on 2548  Progress:  521 on 2548  Progress:  522 on 2548  Progress:  523 on 2548  Progress:  524 on 2548  Progress:  525 on 2548  Progress:  526 on 2548  Progress:  527 on 2548  Progress:  528 on 2548  Progress:  529 on 2548  Progress:  530 on 2548  Progress:  531 on 2548  Progress:  532 on 2548  Progress:  533 on 2548  Progress:  534 on 2548  Progress:  535 on 2548  Progress:  536 on 2548  Progress:  537 on 2548  Progress:  538 on 2548  Progress:  539 on 2548  Progress:  540 on 2548  Progress:  541 on 2548  Progress:  542 on 2548  Progress:  543 on 2548  Progress:  544 on 2548  Progress:  545 on 2548  Progress:  546 on 2548  Progress:  547 on 2548  Progress:  548 on 2548  Progress:  549 on 2548  Progress:  550 on 2548  Progress:  551 on 2548  Progress:  552 on 2548  Progress:  553 on 2548  Progress:  554 on 2548  Progress:  555 on 2548  Progress:  556 on 2548  Progress:  557 on 2548  Progress:  558 on 2548  Progress:  559 on 2548  Progress:  560 on 2548  Progress:  561 on 2548  Progress:  562 on 2548  Progress:  563 on 2548  Progress:  564 on 2548  Progress:  565 on 2548  Progress:  566 on 2548  Progress:  567 on 2548  Progress:  568 on 2548  Progress:  569 on 2548  Progress:  570 on 2548  Progress:  571 on 2548  Progress:  572 on 2548  Progress:  573 on 2548  Progress:  574 on 2548  Progress:  575 on 2548  Progress:  576 on 2548  Progress:  577 on 2548  Progress:  578 on 2548  Progress:  579 on 2548  Progress:  580 on 2548  Progress:  581 on 2548  Progress:  582 on 2548  Progress:  583 on 2548  Progress:  584 on 2548  Progress:  585 on 2548  Progress:  586 on 2548  Progress:  587 on 2548  Progress:  588 on 2548  Progress:  589 on 2548  Progress:  590 on 2548  Progress:  591 on 2548  Progress:  592 on 2548  Progress:  593 on 2548  Progress:  594 on 2548  Progress:  595 on 2548  Progress:  596 on 2548  Progress:  597 on 2548  Progress:  598 on 2548  Progress:  599 on 2548  Progress:  600 on 2548  Progress:  601 on 2548  Progress:  602 on 2548  Progress:  603 on 2548  Progress:  604 on 2548  Progress:  605 on 2548  Progress:  606 on 2548  Progress:  607 on 2548  Progress:  608 on 2548  Progress:  609 on 2548  Progress:  610 on 2548  Progress:  611 on 2548  Progress:  612 on 2548  Progress:  613 on 2548  Progress:  614 on 2548  Progress:  615 on 2548  Progress:  616 on 2548  Progress:  617 on 2548  Progress:  618 on 2548  Progress:  619 on 2548  Progress:  620 on 2548  Progress:  621 on 2548  Progress:  622 on 2548  Progress:  623 on 2548  Progress:  624 on 2548  Progress:  625 on 2548  Progress:  626 on 2548  Progress:  627 on 2548  Progress:  628 on 2548  Progress:  629 on 2548  Progress:  630 on 2548  Progress:  631 on 2548  Progress:  632 on 2548  Progress:  633 on 2548  Progress:  634 on 2548  Progress:  635 on 2548  Progress:  636 on 2548  Progress:  637 on 2548  Progress:  638 on 2548  Progress:  639 on 2548  Progress:  640 on 2548  Progress:  641 on 2548  Progress:  642 on 2548  Progress:  643 on 2548  Progress:  644 on 2548  Progress:  645 on 2548  Progress:  646 on 2548  Progress:  647 on 2548  Progress:  648 on 2548  Progress:  649 on 2548  Progress:  650 on 2548  Progress:  651 on 2548  Progress:  652 on 2548  Progress:  653 on 2548  Progress:  654 on 2548  Progress:  655 on 2548  Progress:  656 on 2548  Progress:  657 on 2548  Progress:  658 on 2548  Progress:  659 on 2548  Progress:  660 on 2548  Progress:  661 on 2548  Progress:  662 on 2548  Progress:  663 on 2548  Progress:  664 on 2548  Progress:  665 on 2548  Progress:  666 on 2548  Progress:  667 on 2548  Progress:  668 on 2548  Progress:  669 on 2548  Progress:  670 on 2548  Progress:  671 on 2548  Progress:  672 on 2548  Progress:  673 on 2548  Progress:  674 on 2548  Progress:  675 on 2548  Progress:  676 on 2548  Progress:  677 on 2548  Progress:  678 on 2548  Progress:  679 on 2548  Progress:  680 on 2548  Progress:  681 on 2548  Progress:  682 on 2548  Progress:  683 on 2548  Progress:  684 on 2548  Progress:  685 on 2548  Progress:  686 on 2548  Progress:  687 on 2548  Progress:  688 on 2548  Progress:  689 on 2548  Progress:  690 on 2548  Progress:  691 on 2548  Progress:  692 on 2548  Progress:  693 on 2548  Progress:  694 on 2548  Progress:  695 on 2548  Progress:  696 on 2548  Progress:  697 on 2548  Progress:  698 on 2548  Progress:  699 on 2548  Progress:  700 on 2548  Progress:  701 on 2548  Progress:  702 on 2548  Progress:  703 on 2548  Progress:  704 on 2548  Progress:  705 on 2548  Progress:  706 on 2548  Progress:  707 on 2548  Progress:  708 on 2548  Progress:  709 on 2548  Progress:  710 on 2548  Progress:  711 on 2548  Progress:  712 on 2548  Progress:  713 on 2548  Progress:  714 on 2548  Progress:  715 on 2548  Progress:  716 on 2548  Progress:  717 on 2548  Progress:  718 on 2548  Progress:  719 on 2548  Progress:  720 on 2548  Progress:  721 on 2548  Progress:  722 on 2548  Progress:  723 on 2548  Progress:  724 on 2548  Progress:  725 on 2548  Progress:  726 on 2548  Progress:  727 on 2548  Progress:  728 on 2548  Progress:  729 on 2548  Progress:  730 on 2548  Progress:  731 on 2548  Progress:  732 on 2548  Progress:  733 on 2548  Progress:  734 on 2548  Progress:  735 on 2548  Progress:  736 on 2548  Progress:  737 on 2548  Progress:  738 on 2548  Progress:  739 on 2548  Progress:  740 on 2548  Progress:  741 on 2548  Progress:  742 on 2548  Progress:  743 on 2548  Progress:  744 on 2548  Progress:  745 on 2548  Progress:  746 on 2548  Progress:  747 on 2548  Progress:  748 on 2548  Progress:  749 on 2548  Progress:  750 on 2548  Progress:  751 on 2548  Progress:  752 on 2548  Progress:  753 on 2548  Progress:  754 on 2548  Progress:  755 on 2548  Progress:  756 on 2548  Progress:  757 on 2548  Progress:  758 on 2548  Progress:  759 on 2548  Progress:  760 on 2548  Progress:  761 on 2548  Progress:  762 on 2548  Progress:  763 on 2548  Progress:  764 on 2548  Progress:  765 on 2548  Progress:  766 on 2548  Progress:  767 on 2548  Progress:  768 on 2548  Progress:  769 on 2548  Progress:  770 on 2548  Progress:  771 on 2548  Progress:  772 on 2548  Progress:  773 on 2548  Progress:  774 on 2548  Progress:  775 on 2548  Progress:  776 on 2548  Progress:  777 on 2548  Progress:  778 on 2548  Progress:  779 on 2548  Progress:  780 on 2548  Progress:  781 on 2548  Progress:  782 on 2548  Progress:  783 on 2548  Progress:  784 on 2548  Progress:  785 on 2548  Progress:  786 on 2548  Progress:  787 on 2548  Progress:  788 on 2548  Progress:  789 on 2548  Progress:  790 on 2548  Progress:  791 on 2548  Progress:  792 on 2548  Progress:  793 on 2548  Progress:  794 on 2548  Progress:  795 on 2548  Progress:  796 on 2548  Progress:  797 on 2548  Progress:  798 on 2548  Progress:  799 on 2548  Progress:  800 on 2548  Progress:  801 on 2548  Progress:  802 on 2548  Progress:  803 on 2548  Progress:  804 on 2548  Progress:  805 on 2548  Progress:  806 on 2548  Progress:  807 on 2548  Progress:  808 on 2548  Progress:  809 on 2548  Progress:  810 on 2548  Progress:  811 on 2548  Progress:  812 on 2548  Progress:  813 on 2548  Progress:  814 on 2548  Progress:  815 on 2548  Progress:  816 on 2548  Progress:  817 on 2548  Progress:  818 on 2548  Progress:  819 on 2548  Progress:  820 on 2548  Progress:  821 on 2548  Progress:  822 on 2548  Progress:  823 on 2548  Progress:  824 on 2548  Progress:  825 on 2548  Progress:  826 on 2548  Progress:  827 on 2548  Progress:  828 on 2548  Progress:  829 on 2548  Progress:  830 on 2548  Progress:  831 on 2548  Progress:  832 on 2548  Progress:  833 on 2548  Progress:  834 on 2548  Progress:  835 on 2548  Progress:  836 on 2548  Progress:  837 on 2548  Progress:  838 on 2548  Progress:  839 on 2548  Progress:  840 on 2548  Progress:  841 on 2548  Progress:  842 on 2548  Progress:  843 on 2548  Progress:  844 on 2548  Progress:  845 on 2548  Progress:  846 on 2548  Progress:  847 on 2548  Progress:  848 on 2548  Progress:  849 on 2548  Progress:  850 on 2548  Progress:  851 on 2548  Progress:  852 on 2548  Progress:  853 on 2548  Progress:  854 on 2548  Progress:  855 on 2548  Progress:  856 on 2548  Progress:  857 on 2548  Progress:  858 on 2548  Progress:  859 on 2548  Progress:  860 on 2548  Progress:  861 on 2548  Progress:  862 on 2548  Progress:  863 on 2548  Progress:  864 on 2548  Progress:  865 on 2548  Progress:  866 on 2548  Progress:  867 on 2548  Progress:  868 on 2548  Progress:  869 on 2548  Progress:  870 on 2548  Progress:  871 on 2548  Progress:  872 on 2548  Progress:  873 on 2548  Progress:  874 on 2548  Progress:  875 on 2548  Progress:  876 on 2548  Progress:  877 on 2548  Progress:  878 on 2548  Progress:  879 on 2548  Progress:  880 on 2548  Progress:  881 on 2548  Progress:  882 on 2548  Progress:  883 on 2548  Progress:  884 on 2548  Progress:  885 on 2548  Progress:  886 on 2548  Progress:  887 on 2548  Progress:  888 on 2548  Progress:  889 on 2548  Progress:  890 on 2548  Progress:  891 on 2548  Progress:  892 on 2548  Progress:  893 on 2548  Progress:  894 on 2548  Progress:  895 on 2548  Progress:  896 on 2548  Progress:  897 on 2548  Progress:  898 on 2548  Progress:  899 on 2548  Progress:  900 on 2548  Progress:  901 on 2548  Progress:  902 on 2548  Progress:  903 on 2548  Progress:  904 on 2548  Progress:  905 on 2548  Progress:  906 on 2548  Progress:  907 on 2548  Progress:  908 on 2548  Progress:  909 on 2548  Progress:  910 on 2548  Progress:  911 on 2548  Progress:  912 on 2548  Progress:  913 on 2548  Progress:  914 on 2548  Progress:  915 on 2548  Progress:  916 on 2548  Progress:  917 on 2548  Progress:  918 on 2548  Progress:  919 on 2548  Progress:  920 on 2548  Progress:  921 on 2548  Progress:  922 on 2548  Progress:  923 on 2548  Progress:  924 on 2548  Progress:  925 on 2548  Progress:  926 on 2548  Progress:  927 on 2548  Progress:  928 on 2548  Progress:  929 on 2548  Progress:  930 on 2548  Progress:  931 on 2548  Progress:  932 on 2548  Progress:  933 on 2548  Progress:  934 on 2548  Progress:  935 on 2548  Progress:  936 on 2548  Progress:  937 on 2548  Progress:  938 on 2548  Progress:  939 on 2548  Progress:  940 on 2548  Progress:  941 on 2548  Progress:  942 on 2548  Progress:  943 on 2548  Progress:  944 on 2548  Progress:  945 on 2548  Progress:  946 on 2548  Progress:  947 on 2548  Progress:  948 on 2548  Progress:  949 on 2548  Progress:  950 on 2548  Progress:  951 on 2548  Progress:  952 on 2548  Progress:  953 on 2548  Progress:  954 on 2548  Progress:  955 on 2548  Progress:  956 on 2548  Progress:  957 on 2548  Progress:  958 on 2548  Progress:  959 on 2548  Progress:  960 on 2548  Progress:  961 on 2548  Progress:  962 on 2548  Progress:  963 on 2548  Progress:  964 on 2548  Progress:  965 on 2548  Progress:  966 on 2548  Progress:  967 on 2548  Progress:  968 on 2548  Progress:  969 on 2548  Progress:  970 on 2548  Progress:  971 on 2548  Progress:  972 on 2548  Progress:  973 on 2548  Progress:  974 on 2548  Progress:  975 on 2548  Progress:  976 on 2548  Progress:  977 on 2548  Progress:  978 on 2548  Progress:  979 on 2548  Progress:  980 on 2548  Progress:  981 on 2548  Progress:  982 on 2548  Progress:  983 on 2548  Progress:  984 on 2548  Progress:  985 on 2548  Progress:  986 on 2548  Progress:  987 on 2548  Progress:  988 on 2548  Progress:  989 on 2548  Progress:  990 on 2548  Progress:  991 on 2548  Progress:  992 on 2548  Progress:  993 on 2548  Progress:  994 on 2548  Progress:  995 on 2548  Progress:  996 on 2548  Progress:  997 on 2548  Progress:  998 on 2548  Progress:  999 on 2548  Progress: 1000 on 2548  Progress: 1001 on 2548  Progress: 1002 on 2548  Progress: 1003 on 2548  Progress: 1004 on 2548  Progress: 1005 on 2548  Progress: 1006 on 2548  Progress: 1007 on 2548  Progress: 1008 on 2548  Progress: 1009 on 2548  Progress: 1010 on 2548  Progress: 1011 on 2548  Progress: 1012 on 2548  Progress: 1013 on 2548  Progress: 1014 on 2548  Progress: 1015 on 2548  Progress: 1016 on 2548  Progress: 1017 on 2548  Progress: 1018 on 2548  Progress: 1019 on 2548  Progress: 1020 on 2548  Progress: 1021 on 2548  Progress: 1022 on 2548  Progress: 1023 on 2548  Progress: 1024 on 2548  Progress: 1025 on 2548  Progress: 1026 on 2548  Progress: 1027 on 2548  Progress: 1028 on 2548  Progress: 1029 on 2548  Progress: 1030 on 2548  Progress: 1031 on 2548  Progress: 1032 on 2548  Progress: 1033 on 2548  Progress: 1034 on 2548  Progress: 1035 on 2548  Progress: 1036 on 2548  Progress: 1037 on 2548  Progress: 1038 on 2548  Progress: 1039 on 2548  Progress: 1040 on 2548  Progress: 1041 on 2548  Progress: 1042 on 2548  Progress: 1043 on 2548  Progress: 1044 on 2548  Progress: 1045 on 2548  Progress: 1046 on 2548  Progress: 1047 on 2548  Progress: 1048 on 2548  Progress: 1049 on 2548  Progress: 1050 on 2548  Progress: 1051 on 2548  Progress: 1052 on 2548  Progress: 1053 on 2548  Progress: 1054 on 2548  Progress: 1055 on 2548  Progress: 1056 on 2548  Progress: 1057 on 2548  Progress: 1058 on 2548  Progress: 1059 on 2548  Progress: 1060 on 2548  Progress: 1061 on 2548  Progress: 1062 on 2548  Progress: 1063 on 2548  Progress: 1064 on 2548  Progress: 1065 on 2548  Progress: 1066 on 2548  Progress: 1067 on 2548  Progress: 1068 on 2548  Progress: 1069 on 2548  Progress: 1070 on 2548  Progress: 1071 on 2548  Progress: 1072 on 2548  Progress: 1073 on 2548  Progress: 1074 on 2548  Progress: 1075 on 2548  Progress: 1076 on 2548  Progress: 1077 on 2548  Progress: 1078 on 2548  Progress: 1079 on 2548  Progress: 1080 on 2548  Progress: 1081 on 2548  Progress: 1082 on 2548  Progress: 1083 on 2548  Progress: 1084 on 2548  Progress: 1085 on 2548  Progress: 1086 on 2548  Progress: 1087 on 2548  Progress: 1088 on 2548  Progress: 1089 on 2548  Progress: 1090 on 2548  Progress: 1091 on 2548  Progress: 1092 on 2548  Progress: 1093 on 2548  Progress: 1094 on 2548  Progress: 1095 on 2548  Progress: 1096 on 2548  Progress: 1097 on 2548  Progress: 1098 on 2548  Progress: 1099 on 2548  Progress: 1100 on 2548  Progress: 1101 on 2548  Progress: 1102 on 2548  Progress: 1103 on 2548  Progress: 1104 on 2548  Progress: 1105 on 2548  Progress: 1106 on 2548  Progress: 1107 on 2548  Progress: 1108 on 2548  Progress: 1109 on 2548  Progress: 1110 on 2548  Progress: 1111 on 2548  Progress: 1112 on 2548  Progress: 1113 on 2548  Progress: 1114 on 2548  Progress: 1115 on 2548  Progress: 1116 on 2548  Progress: 1117 on 2548  Progress: 1118 on 2548  Progress: 1119 on 2548  Progress: 1120 on 2548  Progress: 1121 on 2548  Progress: 1122 on 2548  Progress: 1123 on 2548  Progress: 1124 on 2548  Progress: 1125 on 2548  Progress: 1126 on 2548  Progress: 1127 on 2548  Progress: 1128 on 2548  Progress: 1129 on 2548  Progress: 1130 on 2548  Progress: 1131 on 2548  Progress: 1132 on 2548  Progress: 1133 on 2548  Progress: 1134 on 2548  Progress: 1135 on 2548  Progress: 1136 on 2548  Progress: 1137 on 2548  Progress: 1138 on 2548  Progress: 1139 on 2548  Progress: 1140 on 2548  Progress: 1141 on 2548  Progress: 1142 on 2548  Progress: 1143 on 2548  Progress: 1144 on 2548  Progress: 1145 on 2548  Progress: 1146 on 2548  Progress: 1147 on 2548  Progress: 1148 on 2548  Progress: 1149 on 2548  Progress: 1150 on 2548  Progress: 1151 on 2548  Progress: 1152 on 2548  Progress: 1153 on 2548  Progress: 1154 on 2548  Progress: 1155 on 2548  Progress: 1156 on 2548  Progress: 1157 on 2548  Progress: 1158 on 2548  Progress: 1159 on 2548  Progress: 1160 on 2548  Progress: 1161 on 2548  Progress: 1162 on 2548  Progress: 1163 on 2548  Progress: 1164 on 2548  Progress: 1165 on 2548  Progress: 1166 on 2548  Progress: 1167 on 2548  Progress: 1168 on 2548  Progress: 1169 on 2548  Progress: 1170 on 2548  Progress: 1171 on 2548  Progress: 1172 on 2548  Progress: 1173 on 2548  Progress: 1174 on 2548  Progress: 1175 on 2548  Progress: 1176 on 2548  Progress: 1177 on 2548  Progress: 1178 on 2548  Progress: 1179 on 2548  Progress: 1180 on 2548  Progress: 1181 on 2548  Progress: 1182 on 2548  Progress: 1183 on 2548  Progress: 1184 on 2548  Progress: 1185 on 2548  Progress: 1186 on 2548  Progress: 1187 on 2548  Progress: 1188 on 2548  Progress: 1189 on 2548  Progress: 1190 on 2548  Progress: 1191 on 2548  Progress: 1192 on 2548  Progress: 1193 on 2548  Progress: 1194 on 2548  Progress: 1195 on 2548  Progress: 1196 on 2548  Progress: 1197 on 2548  Progress: 1198 on 2548  Progress: 1199 on 2548  Progress: 1200 on 2548  Progress: 1201 on 2548  Progress: 1202 on 2548  Progress: 1203 on 2548  Progress: 1204 on 2548  Progress: 1205 on 2548  Progress: 1206 on 2548  Progress: 1207 on 2548  Progress: 1208 on 2548  Progress: 1209 on 2548  Progress: 1210 on 2548  Progress: 1211 on 2548  Progress: 1212 on 2548  Progress: 1213 on 2548  Progress: 1214 on 2548  Progress: 1215 on 2548  Progress: 1216 on 2548  Progress: 1217 on 2548  Progress: 1218 on 2548  Progress: 1219 on 2548  Progress: 1220 on 2548  Progress: 1221 on 2548  Progress: 1222 on 2548  Progress: 1223 on 2548  Progress: 1224 on 2548  Progress: 1225 on 2548  Progress: 1226 on 2548  Progress: 1227 on 2548  Progress: 1228 on 2548  Progress: 1229 on 2548  Progress: 1230 on 2548  Progress: 1231 on 2548  Progress: 1232 on 2548  Progress: 1233 on 2548  Progress: 1234 on 2548  Progress: 1235 on 2548  Progress: 1236 on 2548  Progress: 1237 on 2548  Progress: 1238 on 2548  Progress: 1239 on 2548  Progress: 1240 on 2548  Progress: 1241 on 2548  Progress: 1242 on 2548  Progress: 1243 on 2548  Progress: 1244 on 2548  Progress: 1245 on 2548  Progress: 1246 on 2548  Progress: 1247 on 2548  Progress: 1248 on 2548  Progress: 1249 on 2548  Progress: 1250 on 2548  Progress: 1251 on 2548  Progress: 1252 on 2548  Progress: 1253 on 2548  Progress: 1254 on 2548  Progress: 1255 on 2548  Progress: 1256 on 2548  Progress: 1257 on 2548  Progress: 1258 on 2548  Progress: 1259 on 2548  Progress: 1260 on 2548  Progress: 1261 on 2548  Progress: 1262 on 2548  Progress: 1263 on 2548  Progress: 1264 on 2548  Progress: 1265 on 2548  Progress: 1266 on 2548  Progress: 1267 on 2548  Progress: 1268 on 2548  Progress: 1269 on 2548  Progress: 1270 on 2548  Progress: 1271 on 2548  Progress: 1272 on 2548  Progress: 1273 on 2548  Progress: 1274 on 2548  Progress: 1275 on 2548  Progress: 1276 on 2548  Progress: 1277 on 2548  Progress: 1278 on 2548  Progress: 1279 on 2548  Progress: 1280 on 2548  Progress: 1281 on 2548  Progress: 1282 on 2548  Progress: 1283 on 2548  Progress: 1284 on 2548  Progress: 1285 on 2548  Progress: 1286 on 2548  Progress: 1287 on 2548  Progress: 1288 on 2548  Progress: 1289 on 2548  Progress: 1290 on 2548  Progress: 1291 on 2548  Progress: 1292 on 2548  Progress: 1293 on 2548  Progress: 1294 on 2548  Progress: 1295 on 2548  Progress: 1296 on 2548  Progress: 1297 on 2548  Progress: 1298 on 2548  Progress: 1299 on 2548  Progress: 1300 on 2548  Progress: 1301 on 2548  Progress: 1302 on 2548  Progress: 1303 on 2548  Progress: 1304 on 2548  Progress: 1305 on 2548  Progress: 1306 on 2548  Progress: 1307 on 2548  Progress: 1308 on 2548  Progress: 1309 on 2548  Progress: 1310 on 2548  Progress: 1311 on 2548  Progress: 1312 on 2548  Progress: 1313 on 2548  Progress: 1314 on 2548  Progress: 1315 on 2548  Progress: 1316 on 2548  Progress: 1317 on 2548  Progress: 1318 on 2548  Progress: 1319 on 2548  Progress: 1320 on 2548  Progress: 1321 on 2548  Progress: 1322 on 2548  Progress: 1323 on 2548  Progress: 1324 on 2548  Progress: 1325 on 2548  Progress: 1326 on 2548  Progress: 1327 on 2548  Progress: 1328 on 2548  Progress: 1329 on 2548  Progress: 1330 on 2548  Progress: 1331 on 2548  Progress: 1332 on 2548  Progress: 1333 on 2548  Progress: 1334 on 2548  Progress: 1335 on 2548  Progress: 1336 on 2548  Progress: 1337 on 2548  Progress: 1338 on 2548  Progress: 1339 on 2548  Progress: 1340 on 2548  Progress: 1341 on 2548  Progress: 1342 on 2548  Progress: 1343 on 2548  Progress: 1344 on 2548  Progress: 1345 on 2548  Progress: 1346 on 2548  Progress: 1347 on 2548  Progress: 1348 on 2548  Progress: 1349 on 2548  Progress: 1350 on 2548  Progress: 1351 on 2548  Progress: 1352 on 2548  Progress: 1353 on 2548  Progress: 1354 on 2548  Progress: 1355 on 2548  Progress: 1356 on 2548  Progress: 1357 on 2548  Progress: 1358 on 2548  Progress: 1359 on 2548  Progress: 1360 on 2548  Progress: 1361 on 2548  Progress: 1362 on 2548  Progress: 1363 on 2548  Progress: 1364 on 2548  Progress: 1365 on 2548  Progress: 1366 on 2548  Progress: 1367 on 2548  Progress: 1368 on 2548  Progress: 1369 on 2548  Progress: 1370 on 2548  Progress: 1371 on 2548  Progress: 1372 on 2548  Progress: 1373 on 2548  Progress: 1374 on 2548  Progress: 1375 on 2548  Progress: 1376 on 2548  Progress: 1377 on 2548  Progress: 1378 on 2548  Progress: 1379 on 2548  Progress: 1380 on 2548  Progress: 1381 on 2548  Progress: 1382 on 2548  Progress: 1383 on 2548  Progress: 1384 on 2548  Progress: 1385 on 2548  Progress: 1386 on 2548  Progress: 1387 on 2548  Progress: 1388 on 2548  Progress: 1389 on 2548  Progress: 1390 on 2548  Progress: 1391 on 2548  Progress: 1392 on 2548  Progress: 1393 on 2548  Progress: 1394 on 2548  Progress: 1395 on 2548  Progress: 1396 on 2548  Progress: 1397 on 2548  Progress: 1398 on 2548  Progress: 1399 on 2548  Progress: 1400 on 2548  Progress: 1401 on 2548  Progress: 1402 on 2548  Progress: 1403 on 2548  Progress: 1404 on 2548  Progress: 1405 on 2548  Progress: 1406 on 2548  Progress: 1407 on 2548  Progress: 1408 on 2548  Progress: 1409 on 2548  Progress: 1410 on 2548  Progress: 1411 on 2548  Progress: 1412 on 2548  Progress: 1413 on 2548  Progress: 1414 on 2548  Progress: 1415 on 2548  Progress: 1416 on 2548  Progress: 1417 on 2548  Progress: 1418 on 2548  Progress: 1419 on 2548  Progress: 1420 on 2548  Progress: 1421 on 2548  Progress: 1422 on 2548  Progress: 1423 on 2548  Progress: 1424 on 2548  Progress: 1425 on 2548  Progress: 1426 on 2548  Progress: 1427 on 2548  Progress: 1428 on 2548  Progress: 1429 on 2548  Progress: 1430 on 2548  Progress: 1431 on 2548  Progress: 1432 on 2548  Progress: 1433 on 2548  Progress: 1434 on 2548  Progress: 1435 on 2548  Progress: 1436 on 2548  Progress: 1437 on 2548  Progress: 1438 on 2548  Progress: 1439 on 2548  Progress: 1440 on 2548  Progress: 1441 on 2548  Progress: 1442 on 2548  Progress: 1443 on 2548  Progress: 1444 on 2548  Progress: 1445 on 2548  Progress: 1446 on 2548  Progress: 1447 on 2548  Progress: 1448 on 2548  Progress: 1449 on 2548  Progress: 1450 on 2548  Progress: 1451 on 2548  Progress: 1452 on 2548  Progress: 1453 on 2548  Progress: 1454 on 2548  Progress: 1455 on 2548  Progress: 1456 on 2548  Progress: 1457 on 2548  Progress: 1458 on 2548  Progress: 1459 on 2548  Progress: 1460 on 2548  Progress: 1461 on 2548  Progress: 1462 on 2548  Progress: 1463 on 2548  Progress: 1464 on 2548  Progress: 1465 on 2548  Progress: 1466 on 2548  Progress: 1467 on 2548  Progress: 1468 on 2548  Progress: 1469 on 2548  Progress: 1470 on 2548  Progress: 1471 on 2548  Progress: 1472 on 2548  Progress: 1473 on 2548  Progress: 1474 on 2548  Progress: 1475 on 2548  Progress: 1476 on 2548  Progress: 1477 on 2548  Progress: 1478 on 2548  Progress: 1479 on 2548  Progress: 1480 on 2548  Progress: 1481 on 2548  Progress: 1482 on 2548  Progress: 1483 on 2548  Progress: 1484 on 2548  Progress: 1485 on 2548  Progress: 1486 on 2548  Progress: 1487 on 2548  Progress: 1488 on 2548  Progress: 1489 on 2548  Progress: 1490 on 2548  Progress: 1491 on 2548  Progress: 1492 on 2548  Progress: 1493 on 2548  Progress: 1494 on 2548  Progress: 1495 on 2548  Progress: 1496 on 2548  Progress: 1497 on 2548  Progress: 1498 on 2548  Progress: 1499 on 2548  Progress: 1500 on 2548  Progress: 1501 on 2548  Progress: 1502 on 2548  Progress: 1503 on 2548  Progress: 1504 on 2548  Progress: 1505 on 2548  Progress: 1506 on 2548  Progress: 1507 on 2548  Progress: 1508 on 2548  Progress: 1509 on 2548  Progress: 1510 on 2548  Progress: 1511 on 2548  Progress: 1512 on 2548  Progress: 1513 on 2548  Progress: 1514 on 2548  Progress: 1515 on 2548  Progress: 1516 on 2548  Progress: 1517 on 2548  Progress: 1518 on 2548  Progress: 1519 on 2548  Progress: 1520 on 2548  Progress: 1521 on 2548  Progress: 1522 on 2548  Progress: 1523 on 2548  Progress: 1524 on 2548  Progress: 1525 on 2548  Progress: 1526 on 2548  Progress: 1527 on 2548  Progress: 1528 on 2548  Progress: 1529 on 2548  Progress: 1530 on 2548  Progress: 1531 on 2548  Progress: 1532 on 2548  Progress: 1533 on 2548  Progress: 1534 on 2548  Progress: 1535 on 2548  Progress: 1536 on 2548  Progress: 1537 on 2548  Progress: 1538 on 2548  Progress: 1539 on 2548  Progress: 1540 on 2548  Progress: 1541 on 2548  Progress: 1542 on 2548  Progress: 1543 on 2548  Progress: 1544 on 2548  Progress: 1545 on 2548  Progress: 1546 on 2548  Progress: 1547 on 2548  Progress: 1548 on 2548  Progress: 1549 on 2548  Progress: 1550 on 2548  Progress: 1551 on 2548  Progress: 1552 on 2548  Progress: 1553 on 2548  Progress: 1554 on 2548  Progress: 1555 on 2548  Progress: 1556 on 2548  Progress: 1557 on 2548  Progress: 1558 on 2548  Progress: 1559 on 2548  Progress: 1560 on 2548  Progress: 1561 on 2548  Progress: 1562 on 2548  Progress: 1563 on 2548  Progress: 1564 on 2548  Progress: 1565 on 2548  Progress: 1566 on 2548  Progress: 1567 on 2548  Progress: 1568 on 2548  Progress: 1569 on 2548  Progress: 1570 on 2548  Progress: 1571 on 2548  Progress: 1572 on 2548  Progress: 1573 on 2548  Progress: 1574 on 2548  Progress: 1575 on 2548  Progress: 1576 on 2548  Progress: 1577 on 2548  Progress: 1578 on 2548  Progress: 1579 on 2548  Progress: 1580 on 2548  Progress: 1581 on 2548  Progress: 1582 on 2548  Progress: 1583 on 2548  Progress: 1584 on 2548  Progress: 1585 on 2548  Progress: 1586 on 2548  Progress: 1587 on 2548  Progress: 1588 on 2548  Progress: 1589 on 2548  Progress: 1590 on 2548  Progress: 1591 on 2548  Progress: 1592 on 2548  Progress: 1593 on 2548  Progress: 1594 on 2548  Progress: 1595 on 2548  Progress: 1596 on 2548  Progress: 1597 on 2548  Progress: 1598 on 2548  Progress: 1599 on 2548  Progress: 1600 on 2548  Progress: 1601 on 2548  Progress: 1602 on 2548  Progress: 1603 on 2548  Progress: 1604 on 2548  Progress: 1605 on 2548  Progress: 1606 on 2548  Progress: 1607 on 2548  Progress: 1608 on 2548  Progress: 1609 on 2548  Progress: 1610 on 2548  Progress: 1611 on 2548  Progress: 1612 on 2548  Progress: 1613 on 2548  Progress: 1614 on 2548  Progress: 1615 on 2548  Progress: 1616 on 2548  Progress: 1617 on 2548  Progress: 1618 on 2548  Progress: 1619 on 2548  Progress: 1620 on 2548  Progress: 1621 on 2548  Progress: 1622 on 2548  Progress: 1623 on 2548  Progress: 1624 on 2548  Progress: 1625 on 2548  Progress: 1626 on 2548  Progress: 1627 on 2548  Progress: 1628 on 2548  Progress: 1629 on 2548  Progress: 1630 on 2548  Progress: 1631 on 2548  Progress: 1632 on 2548  Progress: 1633 on 2548  Progress: 1634 on 2548  Progress: 1635 on 2548  Progress: 1636 on 2548  Progress: 1637 on 2548  Progress: 1638 on 2548  Progress: 1639 on 2548  Progress: 1640 on 2548  Progress: 1641 on 2548  Progress: 1642 on 2548  Progress: 1643 on 2548  Progress: 1644 on 2548  Progress: 1645 on 2548  Progress: 1646 on 2548  Progress: 1647 on 2548  Progress: 1648 on 2548  Progress: 1649 on 2548  Progress: 1650 on 2548  Progress: 1651 on 2548  Progress: 1652 on 2548  Progress: 1653 on 2548  Progress: 1654 on 2548  Progress: 1655 on 2548  Progress: 1656 on 2548  Progress: 1657 on 2548  Progress: 1658 on 2548  Progress: 1659 on 2548  Progress: 1660 on 2548  Progress: 1661 on 2548  Progress: 1662 on 2548  Progress: 1663 on 2548  Progress: 1664 on 2548  Progress: 1665 on 2548  Progress: 1666 on 2548  Progress: 1667 on 2548  Progress: 1668 on 2548  Progress: 1669 on 2548  Progress: 1670 on 2548  Progress: 1671 on 2548  Progress: 1672 on 2548  Progress: 1673 on 2548  Progress: 1674 on 2548  Progress: 1675 on 2548  Progress: 1676 on 2548  Progress: 1677 on 2548  Progress: 1678 on 2548  Progress: 1679 on 2548  Progress: 1680 on 2548  Progress: 1681 on 2548  Progress: 1682 on 2548  Progress: 1683 on 2548  Progress: 1684 on 2548  Progress: 1685 on 2548  Progress: 1686 on 2548  Progress: 1687 on 2548  Progress: 1688 on 2548  Progress: 1689 on 2548  Progress: 1690 on 2548  Progress: 1691 on 2548  Progress: 1692 on 2548  Progress: 1693 on 2548  Progress: 1694 on 2548  Progress: 1695 on 2548  Progress: 1696 on 2548  Progress: 1697 on 2548  Progress: 1698 on 2548  Progress: 1699 on 2548  Progress: 1700 on 2548  Progress: 1701 on 2548  Progress: 1702 on 2548  Progress: 1703 on 2548  Progress: 1704 on 2548  Progress: 1705 on 2548  Progress: 1706 on 2548  Progress: 1707 on 2548  Progress: 1708 on 2548  Progress: 1709 on 2548  Progress: 1710 on 2548  Progress: 1711 on 2548  Progress: 1712 on 2548  Progress: 1713 on 2548  Progress: 1714 on 2548  Progress: 1715 on 2548  Progress: 1716 on 2548  Progress: 1717 on 2548  Progress: 1718 on 2548  Progress: 1719 on 2548  Progress: 1720 on 2548  Progress: 1721 on 2548  Progress: 1722 on 2548  Progress: 1723 on 2548  Progress: 1724 on 2548  Progress: 1725 on 2548  Progress: 1726 on 2548  Progress: 1727 on 2548  Progress: 1728 on 2548  Progress: 1729 on 2548  Progress: 1730 on 2548  Progress: 1731 on 2548  Progress: 1732 on 2548  Progress: 1733 on 2548  Progress: 1734 on 2548  Progress: 1735 on 2548  Progress: 1736 on 2548  Progress: 1737 on 2548  Progress: 1738 on 2548  Progress: 1739 on 2548  Progress: 1740 on 2548  Progress: 1741 on 2548  Progress: 1742 on 2548  Progress: 1743 on 2548  Progress: 1744 on 2548  Progress: 1745 on 2548  Progress: 1746 on 2548  Progress: 1747 on 2548  Progress: 1748 on 2548  Progress: 1749 on 2548  Progress: 1750 on 2548  Progress: 1751 on 2548  Progress: 1752 on 2548  Progress: 1753 on 2548  Progress: 1754 on 2548  Progress: 1755 on 2548  Progress: 1756 on 2548  Progress: 1757 on 2548  Progress: 1758 on 2548  Progress: 1759 on 2548  Progress: 1760 on 2548  Progress: 1761 on 2548  Progress: 1762 on 2548  Progress: 1763 on 2548  Progress: 1764 on 2548  Progress: 1765 on 2548  Progress: 1766 on 2548  Progress: 1767 on 2548  Progress: 1768 on 2548  Progress: 1769 on 2548  Progress: 1770 on 2548  Progress: 1771 on 2548  Progress: 1772 on 2548  Progress: 1773 on 2548  Progress: 1774 on 2548  Progress: 1775 on 2548  Progress: 1776 on 2548  Progress: 1777 on 2548  Progress: 1778 on 2548  Progress: 1779 on 2548  Progress: 1780 on 2548  Progress: 1781 on 2548  Progress: 1782 on 2548  Progress: 1783 on 2548  Progress: 1784 on 2548  Progress: 1785 on 2548  Progress: 1786 on 2548  Progress: 1787 on 2548  Progress: 1788 on 2548  Progress: 1789 on 2548  Progress: 1790 on 2548  Progress: 1791 on 2548  Progress: 1792 on 2548  Progress: 1793 on 2548  Progress: 1794 on 2548  Progress: 1795 on 2548  Progress: 1796 on 2548  Progress: 1797 on 2548  Progress: 1798 on 2548  Progress: 1799 on 2548  Progress: 1800 on 2548  Progress: 1801 on 2548  Progress: 1802 on 2548  Progress: 1803 on 2548  Progress: 1804 on 2548  Progress: 1805 on 2548  Progress: 1806 on 2548  Progress: 1807 on 2548  Progress: 1808 on 2548  Progress: 1809 on 2548  Progress: 1810 on 2548  Progress: 1811 on 2548  Progress: 1812 on 2548  Progress: 1813 on 2548  Progress: 1814 on 2548  Progress: 1815 on 2548  Progress: 1816 on 2548  Progress: 1817 on 2548  Progress: 1818 on 2548  Progress: 1819 on 2548  Progress: 1820 on 2548  Progress: 1821 on 2548  Progress: 1822 on 2548  Progress: 1823 on 2548  Progress: 1824 on 2548  Progress: 1825 on 2548  Progress: 1826 on 2548  Progress: 1827 on 2548  Progress: 1828 on 2548  Progress: 1829 on 2548  Progress: 1830 on 2548  Progress: 1831 on 2548  Progress: 1832 on 2548  Progress: 1833 on 2548  Progress: 1834 on 2548  Progress: 1835 on 2548  Progress: 1836 on 2548  Progress: 1837 on 2548  Progress: 1838 on 2548  Progress: 1839 on 2548  Progress: 1840 on 2548  Progress: 1841 on 2548  Progress: 1842 on 2548  Progress: 1843 on 2548  Progress: 1844 on 2548  Progress: 1845 on 2548  Progress: 1846 on 2548  Progress: 1847 on 2548  Progress: 1848 on 2548  Progress: 1849 on 2548  Progress: 1850 on 2548  Progress: 1851 on 2548  Progress: 1852 on 2548  Progress: 1853 on 2548  Progress: 1854 on 2548  Progress: 1855 on 2548  Progress: 1856 on 2548  Progress: 1857 on 2548  Progress: 1858 on 2548  Progress: 1859 on 2548  Progress: 1860 on 2548  Progress: 1861 on 2548  Progress: 1862 on 2548  Progress: 1863 on 2548  Progress: 1864 on 2548  Progress: 1865 on 2548  Progress: 1866 on 2548  Progress: 1867 on 2548  Progress: 1868 on 2548  Progress: 1869 on 2548  Progress: 1870 on 2548  Progress: 1871 on 2548  Progress: 1872 on 2548  Progress: 1873 on 2548  Progress: 1874 on 2548  Progress: 1875 on 2548  Progress: 1876 on 2548  Progress: 1877 on 2548  Progress: 1878 on 2548  Progress: 1879 on 2548  Progress: 1880 on 2548  Progress: 1881 on 2548  Progress: 1882 on 2548  Progress: 1883 on 2548  Progress: 1884 on 2548  Progress: 1885 on 2548  Progress: 1886 on 2548  Progress: 1887 on 2548  Progress: 1888 on 2548  Progress: 1889 on 2548  Progress: 1890 on 2548  Progress: 1891 on 2548  Progress: 1892 on 2548  Progress: 1893 on 2548  Progress: 1894 on 2548  Progress: 1895 on 2548  Progress: 1896 on 2548  Progress: 1897 on 2548  Progress: 1898 on 2548  Progress: 1899 on 2548  Progress: 1900 on 2548  Progress: 1901 on 2548  Progress: 1902 on 2548  Progress: 1903 on 2548  Progress: 1904 on 2548  Progress: 1905 on 2548  Progress: 1906 on 2548  Progress: 1907 on 2548  Progress: 1908 on 2548  Progress: 1909 on 2548  Progress: 1910 on 2548  Progress: 1911 on 2548  Progress: 1912 on 2548  Progress: 1913 on 2548  Progress: 1914 on 2548  Progress: 1915 on 2548  Progress: 1916 on 2548  Progress: 1917 on 2548  Progress: 1918 on 2548  Progress: 1919 on 2548  Progress: 1920 on 2548  Progress: 1921 on 2548  Progress: 1922 on 2548  Progress: 1923 on 2548  Progress: 1924 on 2548  Progress: 1925 on 2548  Progress: 1926 on 2548  Progress: 1927 on 2548  Progress: 1928 on 2548  Progress: 1929 on 2548  Progress: 1930 on 2548  Progress: 1931 on 2548  Progress: 1932 on 2548  Progress: 1933 on 2548  Progress: 1934 on 2548  Progress: 1935 on 2548  Progress: 1936 on 2548  Progress: 1937 on 2548  Progress: 1938 on 2548  Progress: 1939 on 2548  Progress: 1940 on 2548  Progress: 1941 on 2548  Progress: 1942 on 2548  Progress: 1943 on 2548  Progress: 1944 on 2548  Progress: 1945 on 2548  Progress: 1946 on 2548  Progress: 1947 on 2548  Progress: 1948 on 2548  Progress: 1949 on 2548  Progress: 1950 on 2548  Progress: 1951 on 2548  Progress: 1952 on 2548  Progress: 1953 on 2548  Progress: 1954 on 2548  Progress: 1955 on 2548  Progress: 1956 on 2548  Progress: 1957 on 2548  Progress: 1958 on 2548  Progress: 1959 on 2548  Progress: 1960 on 2548  Progress: 1961 on 2548  Progress: 1962 on 2548  Progress: 1963 on 2548  Progress: 1964 on 2548  Progress: 1965 on 2548  Progress: 1966 on 2548  Progress: 1967 on 2548  Progress: 1968 on 2548  Progress: 1969 on 2548  Progress: 1970 on 2548  Progress: 1971 on 2548  Progress: 1972 on 2548  Progress: 1973 on 2548  Progress: 1974 on 2548  Progress: 1975 on 2548  Progress: 1976 on 2548  Progress: 1977 on 2548  Progress: 1978 on 2548  Progress: 1979 on 2548  Progress: 1980 on 2548  Progress: 1981 on 2548  Progress: 1982 on 2548  Progress: 1983 on 2548  Progress: 1984 on 2548  Progress: 1985 on 2548  Progress: 1986 on 2548  Progress: 1987 on 2548  Progress: 1988 on 2548  Progress: 1989 on 2548  Progress: 1990 on 2548  Progress: 1991 on 2548  Progress: 1992 on 2548  Progress: 1993 on 2548  Progress: 1994 on 2548  Progress: 1995 on 2548  Progress: 1996 on 2548  Progress: 1997 on 2548  Progress: 1998 on 2548  Progress: 1999 on 2548  Progress: 2000 on 2548  Progress: 2001 on 2548  Progress: 2002 on 2548  Progress: 2003 on 2548  Progress: 2004 on 2548  Progress: 2005 on 2548  Progress: 2006 on 2548  Progress: 2007 on 2548  Progress: 2008 on 2548  Progress: 2009 on 2548  Progress: 2010 on 2548  Progress: 2011 on 2548  Progress: 2012 on 2548  Progress: 2013 on 2548  Progress: 2014 on 2548  Progress: 2015 on 2548  Progress: 2016 on 2548  Progress: 2017 on 2548  Progress: 2018 on 2548  Progress: 2019 on 2548  Progress: 2020 on 2548  Progress: 2021 on 2548  Progress: 2022 on 2548  Progress: 2023 on 2548  Progress: 2024 on 2548  Progress: 2025 on 2548  Progress: 2026 on 2548  Progress: 2027 on 2548  Progress: 2028 on 2548  Progress: 2029 on 2548  Progress: 2030 on 2548  Progress: 2031 on 2548  Progress: 2032 on 2548  Progress: 2033 on 2548  Progress: 2034 on 2548  Progress: 2035 on 2548  Progress: 2036 on 2548  Progress: 2037 on 2548  Progress: 2038 on 2548  Progress: 2039 on 2548  Progress: 2040 on 2548  Progress: 2041 on 2548  Progress: 2042 on 2548  Progress: 2043 on 2548  Progress: 2044 on 2548  Progress: 2045 on 2548  Progress: 2046 on 2548  Progress: 2047 on 2548  Progress: 2048 on 2548  Progress: 2049 on 2548  Progress: 2050 on 2548  Progress: 2051 on 2548  Progress: 2052 on 2548  Progress: 2053 on 2548  Progress: 2054 on 2548  Progress: 2055 on 2548  Progress: 2056 on 2548  Progress: 2057 on 2548  Progress: 2058 on 2548  Progress: 2059 on 2548  Progress: 2060 on 2548  Progress: 2061 on 2548  Progress: 2062 on 2548  Progress: 2063 on 2548  Progress: 2064 on 2548  Progress: 2065 on 2548  Progress: 2066 on 2548  Progress: 2067 on 2548  Progress: 2068 on 2548  Progress: 2069 on 2548  Progress: 2070 on 2548  Progress: 2071 on 2548  Progress: 2072 on 2548  Progress: 2073 on 2548  Progress: 2074 on 2548  Progress: 2075 on 2548  Progress: 2076 on 2548  Progress: 2077 on 2548  Progress: 2078 on 2548  Progress: 2079 on 2548  Progress: 2080 on 2548  Progress: 2081 on 2548  Progress: 2082 on 2548  Progress: 2083 on 2548  Progress: 2084 on 2548  Progress: 2085 on 2548  Progress: 2086 on 2548  Progress: 2087 on 2548  Progress: 2088 on 2548  Progress: 2089 on 2548  Progress: 2090 on 2548  Progress: 2091 on 2548  Progress: 2092 on 2548  Progress: 2093 on 2548  Progress: 2094 on 2548  Progress: 2095 on 2548  Progress: 2096 on 2548  Progress: 2097 on 2548  Progress: 2098 on 2548  Progress: 2099 on 2548  Progress: 2100 on 2548  Progress: 2101 on 2548  Progress: 2102 on 2548  Progress: 2103 on 2548  Progress: 2104 on 2548  Progress: 2105 on 2548  Progress: 2106 on 2548  Progress: 2107 on 2548  Progress: 2108 on 2548  Progress: 2109 on 2548  Progress: 2110 on 2548  Progress: 2111 on 2548  Progress: 2112 on 2548  Progress: 2113 on 2548  Progress: 2114 on 2548  Progress: 2115 on 2548  Progress: 2116 on 2548  Progress: 2117 on 2548  Progress: 2118 on 2548  Progress: 2119 on 2548  Progress: 2120 on 2548  Progress: 2121 on 2548  Progress: 2122 on 2548  Progress: 2123 on 2548  Progress: 2124 on 2548  Progress: 2125 on 2548  Progress: 2126 on 2548  Progress: 2127 on 2548  Progress: 2128 on 2548  Progress: 2129 on 2548  Progress: 2130 on 2548  Progress: 2131 on 2548  Progress: 2132 on 2548  Progress: 2133 on 2548  Progress: 2134 on 2548  Progress: 2135 on 2548  Progress: 2136 on 2548  Progress: 2137 on 2548  Progress: 2138 on 2548  Progress: 2139 on 2548  Progress: 2140 on 2548  Progress: 2141 on 2548  Progress: 2142 on 2548  Progress: 2143 on 2548  Progress: 2144 on 2548  Progress: 2145 on 2548  Progress: 2146 on 2548  Progress: 2147 on 2548  Progress: 2148 on 2548  Progress: 2149 on 2548  Progress: 2150 on 2548  Progress: 2151 on 2548  Progress: 2152 on 2548  Progress: 2153 on 2548  Progress: 2154 on 2548  Progress: 2155 on 2548  Progress: 2156 on 2548  Progress: 2157 on 2548  Progress: 2158 on 2548  Progress: 2159 on 2548  Progress: 2160 on 2548  Progress: 2161 on 2548  Progress: 2162 on 2548  Progress: 2163 on 2548  Progress: 2164 on 2548  Progress: 2165 on 2548  Progress: 2166 on 2548  Progress: 2167 on 2548  Progress: 2168 on 2548  Progress: 2169 on 2548  Progress: 2170 on 2548  Progress: 2171 on 2548  Progress: 2172 on 2548  Progress: 2173 on 2548  Progress: 2174 on 2548  Progress: 2175 on 2548  Progress: 2176 on 2548  Progress: 2177 on 2548  Progress: 2178 on 2548  Progress: 2179 on 2548  Progress: 2180 on 2548  Progress: 2181 on 2548  Progress: 2182 on 2548  Progress: 2183 on 2548  Progress: 2184 on 2548  Progress: 2185 on 2548  Progress: 2186 on 2548  Progress: 2187 on 2548  Progress: 2188 on 2548  Progress: 2189 on 2548  Progress: 2190 on 2548  Progress: 2191 on 2548  Progress: 2192 on 2548  Progress: 2193 on 2548  Progress: 2194 on 2548  Progress: 2195 on 2548  Progress: 2196 on 2548  Progress: 2197 on 2548  Progress: 2198 on 2548  Progress: 2199 on 2548  Progress: 2200 on 2548  Progress: 2201 on 2548  Progress: 2202 on 2548  Progress: 2203 on 2548  Progress: 2204 on 2548  Progress: 2205 on 2548  Progress: 2206 on 2548  Progress: 2207 on 2548  Progress: 2208 on 2548  Progress: 2209 on 2548  Progress: 2210 on 2548  Progress: 2211 on 2548  Progress: 2212 on 2548  Progress: 2213 on 2548  Progress: 2214 on 2548  Progress: 2215 on 2548  Progress: 2216 on 2548  Progress: 2217 on 2548  Progress: 2218 on 2548  Progress: 2219 on 2548  Progress: 2220 on 2548  Progress: 2221 on 2548  Progress: 2222 on 2548  Progress: 2223 on 2548  Progress: 2224 on 2548  Progress: 2225 on 2548  Progress: 2226 on 2548  Progress: 2227 on 2548  Progress: 2228 on 2548  Progress: 2229 on 2548  Progress: 2230 on 2548  Progress: 2231 on 2548  Progress: 2232 on 2548  Progress: 2233 on 2548  Progress: 2234 on 2548  Progress: 2235 on 2548  Progress: 2236 on 2548  Progress: 2237 on 2548  Progress: 2238 on 2548  Progress: 2239 on 2548  Progress: 2240 on 2548  Progress: 2241 on 2548  Progress: 2242 on 2548  Progress: 2243 on 2548  Progress: 2244 on 2548  Progress: 2245 on 2548  Progress: 2246 on 2548  Progress: 2247 on 2548  Progress: 2248 on 2548  Progress: 2249 on 2548  Progress: 2250 on 2548  Progress: 2251 on 2548  Progress: 2252 on 2548  Progress: 2253 on 2548  Progress: 2254 on 2548  Progress: 2255 on 2548  Progress: 2256 on 2548  Progress: 2257 on 2548  Progress: 2258 on 2548  Progress: 2259 on 2548  Progress: 2260 on 2548  Progress: 2261 on 2548  Progress: 2262 on 2548  Progress: 2263 on 2548  Progress: 2264 on 2548  Progress: 2265 on 2548  Progress: 2266 on 2548  Progress: 2267 on 2548  Progress: 2268 on 2548  Progress: 2269 on 2548  Progress: 2270 on 2548  Progress: 2271 on 2548  Progress: 2272 on 2548  Progress: 2273 on 2548  Progress: 2274 on 2548  Progress: 2275 on 2548  Progress: 2276 on 2548  Progress: 2277 on 2548  Progress: 2278 on 2548  Progress: 2279 on 2548  Progress: 2280 on 2548  Progress: 2281 on 2548  Progress: 2282 on 2548  Progress: 2283 on 2548  Progress: 2284 on 2548  Progress: 2285 on 2548  Progress: 2286 on 2548  Progress: 2287 on 2548  Progress: 2288 on 2548  Progress: 2289 on 2548  Progress: 2290 on 2548  Progress: 2291 on 2548  Progress: 2292 on 2548  Progress: 2293 on 2548  Progress: 2294 on 2548  Progress: 2295 on 2548  Progress: 2296 on 2548  Progress: 2297 on 2548  Progress: 2298 on 2548  Progress: 2299 on 2548  Progress: 2300 on 2548  Progress: 2301 on 2548  Progress: 2302 on 2548  Progress: 2303 on 2548  Progress: 2304 on 2548  Progress: 2305 on 2548  Progress: 2306 on 2548  Progress: 2307 on 2548  Progress: 2308 on 2548  Progress: 2309 on 2548  Progress: 2310 on 2548  Progress: 2311 on 2548  Progress: 2312 on 2548  Progress: 2313 on 2548  Progress: 2314 on 2548  Progress: 2315 on 2548  Progress: 2316 on 2548  Progress: 2317 on 2548  Progress: 2318 on 2548  Progress: 2319 on 2548  Progress: 2320 on 2548  Progress: 2321 on 2548  Progress: 2322 on 2548  Progress: 2323 on 2548  Progress: 2324 on 2548  Progress: 2325 on 2548  Progress: 2326 on 2548  Progress: 2327 on 2548  Progress: 2328 on 2548  Progress: 2329 on 2548  Progress: 2330 on 2548  Progress: 2331 on 2548  Progress: 2332 on 2548  Progress: 2333 on 2548  Progress: 2334 on 2548  Progress: 2335 on 2548  Progress: 2336 on 2548  Progress: 2337 on 2548  Progress: 2338 on 2548  Progress: 2339 on 2548  Progress: 2340 on 2548  Progress: 2341 on 2548  Progress: 2342 on 2548  Progress: 2343 on 2548  Progress: 2344 on 2548  Progress: 2345 on 2548  Progress: 2346 on 2548  Progress: 2347 on 2548  Progress: 2348 on 2548  Progress: 2349 on 2548  Progress: 2350 on 2548  Progress: 2351 on 2548  Progress: 2352 on 2548  Progress: 2353 on 2548  Progress: 2354 on 2548  Progress: 2355 on 2548  Progress: 2356 on 2548  Progress: 2357 on 2548  Progress: 2358 on 2548  Progress: 2359 on 2548  Progress: 2360 on 2548  Progress: 2361 on 2548  Progress: 2362 on 2548  Progress: 2363 on 2548  Progress: 2364 on 2548  Progress: 2365 on 2548  Progress: 2366 on 2548  Progress: 2367 on 2548  Progress: 2368 on 2548  Progress: 2369 on 2548  Progress: 2370 on 2548  Progress: 2371 on 2548  Progress: 2372 on 2548  Progress: 2373 on 2548  Progress: 2374 on 2548  Progress: 2375 on 2548  Progress: 2376 on 2548  Progress: 2377 on 2548  Progress: 2378 on 2548  Progress: 2379 on 2548  Progress: 2380 on 2548  Progress: 2381 on 2548  Progress: 2382 on 2548  Progress: 2383 on 2548  Progress: 2384 on 2548  Progress: 2385 on 2548  Progress: 2386 on 2548  Progress: 2387 on 2548  Progress: 2388 on 2548  Progress: 2389 on 2548  Progress: 2390 on 2548  Progress: 2391 on 2548  Progress: 2392 on 2548  Progress: 2393 on 2548  Progress: 2394 on 2548  Progress: 2395 on 2548  Progress: 2396 on 2548  Progress: 2397 on 2548  Progress: 2398 on 2548  Progress: 2399 on 2548  Progress: 2400 on 2548  Progress: 2401 on 2548  Progress: 2402 on 2548  Progress: 2403 on 2548  Progress: 2404 on 2548  Progress: 2405 on 2548  Progress: 2406 on 2548  Progress: 2407 on 2548  Progress: 2408 on 2548  Progress: 2409 on 2548  Progress: 2410 on 2548  Progress: 2411 on 2548  Progress: 2412 on 2548  Progress: 2413 on 2548  Progress: 2414 on 2548  Progress: 2415 on 2548  Progress: 2416 on 2548  Progress: 2417 on 2548  Progress: 2418 on 2548  Progress: 2419 on 2548  Progress: 2420 on 2548  Progress: 2421 on 2548  Progress: 2422 on 2548  Progress: 2423 on 2548  Progress: 2424 on 2548  Progress: 2425 on 2548  Progress: 2426 on 2548  Progress: 2427 on 2548  Progress: 2428 on 2548  Progress: 2429 on 2548  Progress: 2430 on 2548  Progress: 2431 on 2548  Progress: 2432 on 2548  Progress: 2433 on 2548  Progress: 2434 on 2548  Progress: 2435 on 2548  Progress: 2436 on 2548  Progress: 2437 on 2548  Progress: 2438 on 2548  Progress: 2439 on 2548  Progress: 2440 on 2548  Progress: 2441 on 2548  Progress: 2442 on 2548  Progress: 2443 on 2548  Progress: 2444 on 2548  Progress: 2445 on 2548  Progress: 2446 on 2548  Progress: 2447 on 2548  Progress: 2448 on 2548  Progress: 2449 on 2548  Progress: 2450 on 2548  Progress: 2451 on 2548  Progress: 2452 on 2548  Progress: 2453 on 2548  Progress: 2454 on 2548  Progress: 2455 on 2548  Progress: 2456 on 2548  Progress: 2457 on 2548  Progress: 2458 on 2548  Progress: 2459 on 2548  Progress: 2460 on 2548  Progress: 2461 on 2548  Progress: 2462 on 2548  Progress: 2463 on 2548  Progress: 2464 on 2548  Progress: 2465 on 2548  Progress: 2466 on 2548  Progress: 2467 on 2548  Progress: 2468 on 2548  Progress: 2469 on 2548  Progress: 2470 on 2548  Progress: 2471 on 2548  Progress: 2472 on 2548  Progress: 2473 on 2548  Progress: 2474 on 2548  Progress: 2475 on 2548  Progress: 2476 on 2548  Progress: 2477 on 2548  Progress: 2478 on 2548  Progress: 2479 on 2548  Progress: 2480 on 2548  Progress: 2481 on 2548  Progress: 2482 on 2548  Progress: 2483 on 2548  Progress: 2484 on 2548  Progress: 2485 on 2548  Progress: 2486 on 2548  Progress: 2487 on 2548  Progress: 2488 on 2548  Progress: 2489 on 2548  Progress: 2490 on 2548  Progress: 2491 on 2548  Progress: 2492 on 2548  Progress: 2493 on 2548  Progress: 2494 on 2548  Progress: 2495 on 2548  Progress: 2496 on 2548  Progress: 2497 on 2548  Progress: 2498 on 2548  Progress: 2499 on 2548  Progress: 2500 on 2548  Progress: 2501 on 2548  Progress: 2502 on 2548  Progress: 2503 on 2548  Progress: 2504 on 2548  Progress: 2505 on 2548  Progress: 2506 on 2548  Progress: 2507 on 2548  Progress: 2508 on 2548  Progress: 2509 on 2548  Progress: 2510 on 2548  Progress: 2511 on 2548  Progress: 2512 on 2548  Progress: 2513 on 2548  Progress: 2514 on 2548  Progress: 2515 on 2548  Progress: 2516 on 2548  Progress: 2517 on 2548  Progress: 2518 on 2548  Progress: 2519 on 2548  Progress: 2520 on 2548  Progress: 2521 on 2548  Progress: 2522 on 2548  Progress: 2523 on 2548  Progress: 2524 on 2548  Progress: 2525 on 2548  Progress: 2526 on 2548  Progress: 2527 on 2548  Progress: 2528 on 2548  Progress: 2529 on 2548  Progress: 2530 on 2548  Progress: 2531 on 2548  Progress: 2532 on 2548  Progress: 2533 on 2548  Progress: 2534 on 2548  Progress: 2535 on 2548  Progress: 2536 on 2548  Progress: 2537 on 2548  Progress: 2538 on 2548  Progress: 2539 on 2548  Progress: 2540 on 2548  Progress: 2541 on 2548  Progress: 2542 on 2548  Progress: 2543 on 2548  Progress: 2544 on 2548  Progress: 2545 on 2548  Progress: 2546 on 2548  Progress: 2547 on 2548  Progress: 2548 on 2548  
pbl_bn_viaf_import <- pbl_bn_viaf_import %>% 
  rename(pbl_id = TW_TWORCA_ID,
         pbl_nazwisko = TW_NAZWISKO,
         pbl_imie = TW_IMIE,
         BN_id = id,
         BN_name = name) %>% 
  mutate(czy_ten_sam = "tak") %>% 
  select(pbl_id,pbl_nazwisko,pbl_imie,BN_id,BN_name,czy_ten_sam,viaf) %>% 
  unique()
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KVVdBR0EhDQpXeWN6ecWbY2nEhyBsaXN0xJkgbWFwb3dhbmllX29zb2JfYm5fcGJsX3BvX2ltcG9yY2llICh6YSBkdcW8byBuaWVwb3ByYXdueWNoIHJlbGFjamkgcGJsLWJuIHBvIG9zdGF0bmltIGltcG9yY2llKQ0KUHJ6ZWQgcm96cG9jesSZY2llbSBwcmFjeSB6YWt0dWFsaXp1aiB6Z29kbmllIHogb2JlY255bSBzdGFuZW0gYmF6eSBsaXN0xJkga3NpxIXFvGVrIG5hIGR5c2t1IHphIHBvcHJ6ZWRuaSByb2N6bmlrLg0KUHJ6ZWQgcm96cG9jesSZY2llbSBwcmFjeSB3eXN6dWthaiBmcmF6eSAiYmV6cGllY3puaWsiIGkgImFrdHVhbGl6YWNqYSIuDQpgYGB7ciBXY3p5dGFuaWUgcGxpa8Ozd30NCiNpbnN0YWxsLnBhY2thZ2VzKGMoInV0ZjgiLCJnb29nbGVzaGVldHM0Iiwiem9vIiwic3RyaW5nciIsInNwbGl0c3RhY2tzaGFwZSIsInBseXIiLCJkcGx5ciIsInNxbGRmIiwic3RyaW5nZGlzdCIsImZ1enp5am9pbiIsImRhdGEudGFibGUiLCJzdk1pc2MiLCJ0aWR5dmVyc2UiLCJSSkRCQyIsImFycmFuZ2VtZW50cyIsInRva2VuaXplcnMiLCJvcGVueGxzeCIsImpzb25saXRlIiwicGFjbWFuIikpDQojZGV2dG9vbHM6Omluc3RhbGxfZ2l0aHViKCJyLWxpYi9nYXJnbGUiKQ0KZW1wbG95ZWVfbmFtZSA8LSByZWFkbGluZShwcm9tcHQ9IkVudGVyIG5hbWU6ICIpDQppbXBvcnRfeWVhciA8LSByZWFkbGluZShwcm9tcHQ9IkVudGVyIHllYXI6ICIpDQojYmlibGlvdGVraQ0Kb3B0aW9ucyhqYXZhLnBhcmFtZXRlcnMgPSAiLVhteDMyMDAwbSIpDQpvcHRpb25zKHNjaXBlbiA9IDk5OSkNCnBhY21hbjo6cF9sb2FkKHV0ZjgsZ29vZ2xlc2hlZXRzNCx6b28sc3RyaW5ncixzcGxpdHN0YWNrc2hhcGUscGx5cixkcGx5cixzcWxkZixzdHJpbmdkaXN0LGZ1enp5am9pbixkYXRhLnRhYmxlLHN2TWlzYyx0aWR5dmVyc2UsUkpEQkMsYXJyYW5nZW1lbnRzLHRva2VuaXplcnMsb3Blbnhsc3gsanNvbmxpdGUpDQpgJW5vdGluJWAgPC0gTmVnYXRlKGAlaW4lYCkNCiNwb8WCxIVjemVuaWUgeiBiYXrEhSBQQkwNCmpkYmNEcml2ZXIgPUpEQkMoIm9yYWNsZS5qZGJjLk9yYWNsZURyaXZlciIsY2xhc3NQYXRoPXBhc3RlKCJDOi9Vc2Vycy8iLGVtcGxveWVlX25hbWUsIi9Eb3dubG9hZHMvb2pkYmM2LmphciIsc2VwID0gIiIpKQ0KUEJMIDwtIGRiQ29ubmVjdChqZGJjRHJpdmVyLCAiamRiYzpvcmFjbGU6dGhpbjpALy9wYmwuaWJsLnBvem5hbi5wbDoxNTIxL3hlIiwgIklCTF9TRUxFQ1QiLCAiQ1IzMzM0NDQiKQ0KDQojd2dyYW5pZSB6YmlvcsOzdyBrc2nEhcW8ZWsNCmJuX2tzIDwtIHJlYWQuY3N2MihwYXN0ZSgiQzovVXNlcnMvIixlbXBsb3llZV9uYW1lLCIvRG93bmxvYWRzL2JuX2tzXyIsaW1wb3J0X3llYXIsIi5jc3YiLHNlcCA9ICIiKSwgZW5jb2RpbmcgPSAiVVRGLTgiLCBoZWFkZXIgPSBUUlVFLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpICU+JQ0KICBtdXRhdGUocm9rID0gc3RyX3N1YihYMDA4LDgsMTEpKSAlPiUgDQogIGZpbHRlcihyb2sgPT0gaW1wb3J0X3llYXIsDQogICAgICAgICAhZ3JlcGwoIlxcXFwkYUFydHlrdcWCeXxcXFxcJERydWtpIHVsb3RuZSIsWDM4MCksDQogICAgICAgICAhZ3JlcGwoIlxcJGFOYWRiaXRraSBpIG9kYml0a2kiLFg2NTUpLA0KICAgICAgICAgZ3JlcGwoIktzacSFxbxraSIsWDM4MCxpZ25vcmUuY2FzZSA9IEZBTFNFKXxYMzgwPT0iIiwNCiAgICAgICAgIGdyZXBsKCJcXCRhV0F8XFwkYVcgIixYMDQwKSwNCiAgICAgICAgIFg2NTUhPSJcXDckYUtvbWlrcyQyREJOIiwNCiAgICAgICAgICFncmVwbCgiXFwkaFxcW0ZpbG1cXF18XFwkaFxcW0Rva3VtZW50IGTFundpxJlrb3d5XFxdIiwgWDI0NSkpICU+JQ0KICBtdXRhdGUoWDI0NSA9IHN0cl9yZXBsYWNlX2FsbChYMjQ1LCIgXFwvIFxcJGMiLCIgLyRjIiksDQogICAgICAgICBCTl9VUkwgPSBwYXN0ZSgiaHR0cHM6Ly9rYXRhbG9naS5ibi5vcmcucGwvZGlzY292ZXJ5L2Z1bGxkaXNwbGF5P2RvY2lkPWFsbWEiLGFzLmNoYXJhY3RlcihYMDA5KSwiJmNvbnRleHQ9TCZ2aWQ9NDhPTU5JU19OTE9QOjQ4T01OSVNfTkxPUCZsYW5nPXBsIixzZXAgPSAiIiksDQogICAgICAgICBCTl9VUkwgPSBzdHJfcmVwbGFjZShCTl9VUkwsIjg4JiIsIjY2JiIpKQ0KDQojIyMgcHJ6ZW5pZcWbxIcga29sZWpueWNoIGF1dG9yw7N3IHogNzAwIGRvIHBvbGEgMTAwDQptYXJjX2ZpZWxkXzcwMCA8LSBibl9rcyAlPiUNCiAgc2VsZWN0KGlkLFg3MDApJT4lDQogIGZpbHRlcihYNzAwIT0iIikgJT4lDQogIG11dGF0ZShYNzAwPXN0cl9yZXBsYWNlX2FsbChYNzAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg3MDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDcwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDcwMD1zdHJfcmVtb3ZlX2FsbChYNzAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg3MDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoYm5fa3MkWDcwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzcwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF83MDA8LWNiaW5kKG1hcmNfZmllbGRfNzAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQoNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNzAwJFg3MDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF83MDAkWDcwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF83MDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF83MDAkWDcwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNzAwJFg3MDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KbWFyY19maWVsZF83MDAgPC0gbWFyY19maWVsZF83MDAgJT4lDQogIGZpbHRlcihpcy5uYShgJGVgKSZpcy5uYShgJHRgKSkgJT4lDQogIHNlbGVjdChpZCwgWDcwMCkgJT4lDQogIG11dGF0ZShkcnVnaV9hdXRvciA9IHN0cl9yZW1vdmVfYWxsKFg3MDAsIlxcfCIpKSAlPiUNCiAgc2VsZWN0KGlkLGRydWdpX2F1dG9yKQ0KDQpkcnVnaV9hdXRvciA8LSBibl9rcyAlPiUNCiAgZnVsbF9qb2luKC4sbWFyY19maWVsZF83MDAsYnkgPSAiaWQiKSAlPiUNCiAgc2VsZWN0KGlkLFgxMDAsWDcwMCxkcnVnaV9hdXRvcikgJT4lDQogIGdyb3VwX2J5KGlkKSAlPiUNCiAgbXV0YXRlKFgxMDAgPSBpZmVsc2UoIWlzLm5hKGRydWdpX2F1dG9yKSxzdHJfcmVtb3ZlKHBhc3RlKFgxMDAscGFzdGUoZHJ1Z2lfYXV0b3IsY29sbGFwc2UgPSAifCIpLHNlcCA9ICJ8IiksIl5cXHwiKSxhcy5jaGFyYWN0ZXIoWDEwMCkpLA0KICAgICAgICAgZHJ1Z2lfYXV0b3IgPSBsaXN0KGRydWdpX2F1dG9yKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkNCiAgDQp4IDwtIDE6bGVuZ3RoKGRydWdpX2F1dG9yJGlkKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICB5IDwtIDE6bGVuZ3RocyhkcnVnaV9hdXRvciRkcnVnaV9hdXRvcltpXSkNCiAgZm9yIChqIGluIHkpIHsNCiAgICBkcnVnaV9hdXRvciRYNzAwW2ldIDwtIGlmZWxzZShpcy5uYShkcnVnaV9hdXRvciRkcnVnaV9hdXRvcltpXSksYXMuY2hhcmFjdGVyKGRydWdpX2F1dG9yJFg3MDBbaV0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKHN0cl9yZXBsYWNlX2FsbChzdHJfcmVwbGFjZV9hbGwoc3RyX3JlcGxhY2VfYWxsKHN0cl9yZXBsYWNlX2FsbChkcnVnaV9hdXRvciRkcnVnaV9hdXRvcltpXVtbMV1dW2pdLCJcXFxcIiwiXFxcXFxcXFwiKSwiXFwkIiwiXFxcXCQiKSwiXFwoIiwiXFxcXCgiKSwiXFwpIiwiXFxcXCkiKSxkcnVnaV9hdXRvciRYNzAwW2ldKSxzdHJfcmVtb3ZlKGRydWdpX2F1dG9yJFg3MDBbaV0sc3RyX3JlcGxhY2VfYWxsKHN0cl9yZXBsYWNlX2FsbChzdHJfcmVwbGFjZV9hbGwoc3RyX3JlcGxhY2VfYWxsKGRydWdpX2F1dG9yJGRydWdpX2F1dG9yW2ldW1sxXV1bal0sIlxcXFwiLCJcXFxcXFxcXCIpLCJcXCQiLCJcXFxcJCIpLCJcXCgiLCJcXFxcKCIpLCJcXCkiLCJcXFxcKSIpKSxhcy5jaGFyYWN0ZXIoZHJ1Z2lfYXV0b3IkWDcwMFtpXSkpKQ0KICB9DQp9DQoNCmRydWdpX2F1dG9yIDwtIGRydWdpX2F1dG9yICU+JQ0KICBtdXRhdGUoWDcwMCA9IHN0cl9yZXBsYWNlX2FsbChYNzAwLCIoXFx8KSsiLCJ8IiksDQogICAgICAgICBYNzAwID0gc3RyX3JlbW92ZShYNzAwLCJcXHx8JCIpLA0KICAgICAgICAgWDcwMCA9IGlmZWxzZShYNzAwPT0ifCIsIiIsYXMuY2hhcmFjdGVyKFg3MDApKSkgJT4lDQogIHNlbGVjdChpZCxYMTAwLFg3MDApDQpibl9rcyA8LSBibl9rcyAlPiUNCiAgbXV0YXRlKFgxMDAgPSBkcnVnaV9hdXRvciRYMTAwLA0KICAgICAgICAgWDcwMCA9IGRydWdpX2F1dG9yJFg3MDApDQojI2tvbmllYyBwcnplbm9zaW4NCmNodW5rMSA8LSBibl9rcw0KYGBgDQoNCmBgYHtyIGdlbmVyb3dhbmllIGxpc3R5IHphcGlzb3cgeiBvc29iYW1pIFBCTH0NCmJuX2tzIDwtIGNodW5rMQ0KI3djenl0YW5pZSBsaXN0eSB1dG/FvHNhbWlvbnljaCB0d8OzcmPDs3cgeiBhdXRvcmFtaSBCTg0KI2JlenBpZWN6bmlrOiB1xbx5xIcgc2hlZXRzX2F1dGgoKSB6IGtvbnNvbGkNCnBibF92aWFmIDwtIHNoZWV0c19yZWFkKHNzID0gIjFjRXo3M2RHTjJyMi1UVGM3MDJ5bmU5dEtmSDlQUTZVeUFKMnpCU1Y2SmIwIikgJT4lDQogIGZpbHRlcihjenlfdGVuX3NhbSE9Im5pZSIpICU+JQ0KICBzZWxlY3QocGJsX2lkLCBCTl9pZCwgQk5fbmFtZSkgJT4lDQogIG11dGF0ZShCTl9uYW1lID0gc3RyX3JlcGxhY2VfYWxsKEJOX25hbWUsIlxcfFxcKCIsICIgKCIpLA0KICAgICAgICAgQk5fbmFtZSA9IHN0cl9yZXBsYWNlX2FsbChCTl9uYW1lLCAiXFw7XFx8IiwgIjsgIikpICU+JQ0KICBjU3BsaXQoLiwiQk5fbmFtZSIsc2VwID0gInwiLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihCTl9uYW1lIT0iIikNCnBibF92aWFmMiA8LSBzaGVldHNfcmVhZChzcyA9ICIxX0Jod3pvMHh1NHlUbjh0RjBaTkFacTlpSUFxSXhmY3JqZUxWQ21fbWdnTSIpICU+JQ0KICBmaWx0ZXIoY3p5X3Rlbl9zYW0hPSJuaWUiKSAlPiUNCiAgc2VsZWN0KHBibF9pZCwgQk5faWQsIEJOX25hbWUpICU+JQ0KICBtdXRhdGUoQk5fbmFtZSA9IHN0cl9yZXBsYWNlX2FsbChCTl9uYW1lLCJcXHxcXCgiLCAiICgiKSwNCiAgICAgICAgIEJOX25hbWUgPSBzdHJfcmVwbGFjZV9hbGwoQk5fbmFtZSwgIlxcO1xcfCIsICI7ICIpKSAlPiUNCiAgY1NwbGl0KC4sIkJOX25hbWUiLHNlcCA9ICJ8IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoQk5fbmFtZSE9IiIpDQpwYmxfdmlhZjMgPC0gc2hlZXRzX3JlYWQoc3MgPSAiMUwtN1p2OUV5THI1RmVDSVlfczkwclQ1SHo2RGpBU2NDeDZOeGZ1SHZvRVEiKSAlPiUNCiAgZmlsdGVyKGN6eV90ZW5fc2FtIT0ibmllIikgJT4lDQogIHNlbGVjdChwYmxfaWQsIEJOX2lkLCBCTl9uYW1lKSAlPiUNCiAgbXV0YXRlKEJOX25hbWUgPSBzdHJfcmVwbGFjZV9hbGwoQk5fbmFtZSwiXFx8XFwoIiwgIiAoIiksDQogICAgICAgICBCTl9uYW1lID0gc3RyX3JlcGxhY2VfYWxsKEJOX25hbWUsICJcXDtcXHwiLCAiOyAiKSkgJT4lDQogIGNTcGxpdCguLCJCTl9uYW1lIixzZXAgPSAifCIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKEJOX25hbWUhPSIiKQ0KcGJsX3ZpYWYgPC0gcmJpbmQocGJsX3ZpYWYscGJsX3ZpYWYyLCBwYmxfdmlhZjMpICU+JQ0KICBhcnJhbmdlKHBibF9pZCkgJT4lDQogIHVuaXF1ZSgpDQpyZW1vdmUocGJsX3ZpYWYyKQ0KcmVtb3ZlKHBibF92aWFmMykNCg0KI2JlenBpZWN6bmlrIQ0KI3NwcmF3ZMW6LCBjenkgamVkbm8gaGFzxYJvIGJuIG5pZSB6YXNpbGEga2lsa3UgaGFzZcWCIHR3w7NyY8OzdyBwYmwNCg0KIyBwYmxfdmlhZl90ZXN0MSA8LSBzaGVldHNfcmVhZChzcyA9ICIxY0V6NzNkR04ycjItVFRjNzAyeW5lOXRLZkg5UFE2VXlBSjJ6QlNWNkpiMCIpICU+JQ0KIyAgZmlsdGVyKGN6eV90ZW5fc2FtIT0ibmllIikgJT4lDQojICBzZWxlY3QocGJsX2lkLCBCTl9pZCwgQk5fbmFtZSkNCiMgcGJsX3ZpYWZfdGVzdDIgPC0gc2hlZXRzX3JlYWQoc3MgPSAiMV9CaHd6bzB4dTR5VG44dEYwWk5BWnE5aUlBcUl4ZmNyamVMVkNtX21nZ00iKSAlPiUNCiMgIGZpbHRlcihjenlfdGVuX3NhbSE9Im5pZSIpICU+JQ0KIyAgc2VsZWN0KHBibF9pZCwgQk5faWQsIEJOX25hbWUpDQojIHBibF92aWFmX3Rlc3QzIDwtIHNoZWV0c19yZWFkKHNzID0gIjFMLTdadjlFeUxyNUZlQ0lZX3M5MHJUNUh6NkRqQVNjQ3g2TnhmdUh2b0VRIikgJT4lDQojICAgZmlsdGVyKGN6eV90ZW5fc2FtIT0ibmllIikgJT4lDQojICAgc2VsZWN0KHBibF9pZCwgQk5faWQsIEJOX25hbWUpDQojIHBibF92aWFmX3Rlc3QgPC0gcmJpbmQocGJsX3ZpYWZfdGVzdDEscGJsX3ZpYWZfdGVzdDIscGJsX3ZpYWZfdGVzdDMpICU+JQ0KIyAgYXJyYW5nZShwYmxfaWQpICU+JQ0KIyAgdW5pcXVlKCkNCiMgDQojIGNvdW50IDwtIGFzLmRhdGEuZnJhbWUodGFibGUocGJsX3ZpYWZfdGVzdCRCTl9pZCkpDQojIHBibF92aWFmX3Rlc3RfMSA8LSBtZXJnZShwYmxfdmlhZl90ZXN0LGNvdW50LGJ5LnggPSAiQk5faWQiLGJ5LnkgPSAiVmFyMSIsYWxsLnggPSBUUlVFKSAlPiUNCiMgIHVuaXF1ZSgpDQoNCiNiZXpwaWVjem5payENCiN3IG9iaWVrY2llIHBibF92aWFmX3Rlc3RfMSBwcnp5IGZyZWt3ZW5jamkgd2nEmWtzemVqIG5pxbwgMSBuYWxlxbx5IHByemVhbmFsaXpvd2HEhyBncnVweSwgamXFm2xpIGRvIHRlZ28gc2FtZWdvIGlkZW50eWZpa2F0b3JhIHBibCBwcnp5cGlzYW5lIHNhIHLDs8W8bmUgaWRlbnR5ZmlrYXRvcnkgYm4sIGt0w7NyZSBqZWRuYWsgb3Bpc3VqxIUgdMSZIHNhbcSFIG9zb2LEmSwgdG8gd3N6eXN0a28gamVzdCBva2VqOyB3IHByemVjaXdueW0gcmF6aWUgdHJ6ZWJhIHByemVwcm93YWR6acSHIGtvcmVrdMSZIHcgcGxpa2FjaCAibWFwb3dhbmllX29zb2JfYm5fcGJsIg0KDQojIGNvdW50MiA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKHBibF92aWFmX3Rlc3QkcGJsX2lkKSkNCiMgcGJsX3ZpYWZfdGVzdF8yIDwtIG1lcmdlKHBibF92aWFmX3Rlc3QsY291bnQyLGJ5LnggPSAicGJsX2lkIixieS55ID0gIlZhcjEiLGFsbC54ID0gVFJVRSkgJT4lDQojICB1bmlxdWUoKQ0KDQojYmV6cGllY3puaWshDQojZGxhIGdydXB5IG8gZnJla3dlbmNqaSB3acSZa3N6ZWogbmnFvCAxIHNwcmF3ZMW6LCBjenkgdyB6ZXN0YXdpZSBpZGVudHlmaWthdG9yw7N3IGJuIG5pZSBtYSByYcW8xIVjeWNoIGLFgsSZZMOzdzsgdyBwcnplY2l3bnltIHJhemllIHRyemViYSBwcnplcHJvd2FkemnEhyBrb3Jla3TEmSB3IHBsaWthY2ggIm1hcG93YW5pZV9vc29iX2JuX3BibCINCg0KI3V0b8W8c2FtaWFuaWUgcG8gbmF6ZXduaWN0d2llIHogaW5mb3JtYWNqxIUgbyBkemlhbGUNCnR3b3JjYV9pX2R6aWFsIDwtIGRiR2V0UXVlcnkoUEJMLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IHR3LnR3X3R3b3JjYV9pZCBcInBibF9pZFwiLCBkei5kel9kemlhbF9pZHx8J3wnfHxkei5kel9uYXp3YSBcIm9zb2JhX3BibF9kemlhbF9pZF9uYW1lXCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gcGJsX3R3b3JjeSB0dw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbCBqb2luIHBibF9kemlhbHkgZHogb24gZHouZHpfZHppYWxfaWQ9dHcudHdfZHpfZHppYWxfaWQiKQ0KDQojbGlzdHkgbmF6d2lzayBCTiB6ZSB6YmlvcnUNCiMxMDANCm1hcmNfZmllbGRfMTAwIDwtIGJuX2tzICU+JQ0KICBzZWxlY3QoaWQsWDEwMCklPiUNCiAgZmlsdGVyKFgxMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgxMDA9c3RyX3JlcGxhY2VfYWxsKFgxMDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDEwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMTAwIT0iIikgJT4lDQogIG11dGF0ZShYMTAwPXN0cl9yZW1vdmVfYWxsKFgxMDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDEwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChibl9rcyRYMTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzEwMDwtY2JpbmQobWFyY19maWVsZF8xMDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8xMDAkWDEwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzEwMCRYMTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzEwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzEwMCRYMTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8xMDAkWDEwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF8xMDAgPC0gbWFyY19maWVsZF8xMDAgJT4lDQogIHNlbGVjdChpZCxgJGFgLGAkZGAsYCRjYCkgJT4lDQogIG11dGF0ZShuYW1lID0gaWZlbHNlKCFpcy5uYShgJGNgKSZzdWJzdHIoYCRjYCxuY2hhcihgJGNgKSxuY2hhcihgJGNgKSk9PSI7IixwYXN0ZShgJGFgLGAkY2AsYCRkYCxzZXAgPSAiICIpLGlmZWxzZSghaXMubmEoYCRkYCkscGFzdGUoYCRhYCxgJGRgLHNlcCA9ICIgIiksYXMuY2hhcmFjdGVyKGAkYWApKSkpICU+JQ0KICBzZWxlY3QoaWQsbmFtZSkgJT4lDQogIG11dGF0ZShuYW1lID0gc3RyX3JlcGxhY2UobmFtZSwiKFxcKSkoXFwuJCkiLCJcXDEiKSwNCiAgICAgICAgIG5hbWUgPSBzdHJfcmVwbGFjZShuYW1lLCAiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoXFwuJCkiLCJcXDEiKSkNCg0Kb3NvYmFfYm5fMTAwX3BibCA8LSBtYXJjX2ZpZWxkXzEwMCAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIGlubmVyX2pvaW4oLixwYmxfdmlhZixieSA9IGMoIm5hbWUiID0gIkJOX25hbWUiKSkgJT4lDQogIHNlbGVjdCgxOjMpICU+JQ0KICBsZWZ0X2pvaW4oLix0d29yY2FfaV9kemlhbCxieSA9ICJwYmxfaWQiKSAlPiUNCiAgc2VsZWN0KGlkLG9zb2JhX3BibF9kemlhbF9pZF9uYW1lKSAlPiUNCiAgZ3JvdXBfYnkoaWQpICU+JQ0KICBtdXRhdGUob3NvYmFfYm5fYXV0b3IgPSBwYXN0ZSh1bmlxdWUob3NvYmFfcGJsX2R6aWFsX2lkX25hbWUpLGNvbGxhcHNlID0gIn4iKSkgJT4lDQogIHNlbGVjdCgtb3NvYmFfcGJsX2R6aWFsX2lkX25hbWUpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpDQoNCiM2MDANCm1hcmNfZmllbGRfNjAwIDwtIGJuX2tzICU+JQ0KICBzZWxlY3QoaWQsWDYwMCklPiUNCiAgZmlsdGVyKFg2MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg2MDA9c3RyX3JlcGxhY2VfYWxsKFg2MDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDYwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNjAwIT0iIikgJT4lDQogIG11dGF0ZShYNjAwPXN0cl9yZW1vdmVfYWxsKFg2MDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDYwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChibl9rcyRYNjAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNjAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzYwMDwtY2JpbmQobWFyY19maWVsZF82MDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCg0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF82MDAkWDYwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzYwMCRYNjAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzYwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzYwMCRYNjAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF82MDAkWDYwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF82MDAgPC0gbWFyY19maWVsZF82MDAgJT4lDQogIHNlbGVjdChpZCxgJGFgLGAkZGAsYCRjYCkgJT4lDQogIG11dGF0ZShuYW1lID0gaWZlbHNlKCFpcy5uYShgJGNgKSZzdWJzdHIoYCRjYCxuY2hhcihgJGNgKSxuY2hhcihgJGNgKSk9PSI7IixwYXN0ZShgJGFgLGAkY2AsYCRkYCxzZXAgPSAiICIpLGlmZWxzZSghaXMubmEoYCRkYCkscGFzdGUoYCRhYCxgJGRgLHNlcCA9ICIgIiksYXMuY2hhcmFjdGVyKGAkYWApKSkpICU+JQ0KICBzZWxlY3QoaWQsbmFtZSkgJT4lDQogIG11dGF0ZShuYW1lID0gc3RyX3JlcGxhY2UobmFtZSwiKFxcKSkoXFwuJCkiLCJcXDEiKSwNCiAgICAgICAgIG5hbWUgPSBzdHJfcmVwbGFjZShuYW1lLCAiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoXFwuJCkiLCJcXDEiKSkNCm9zb2JhX2JuXzYwMF9wYmwgPC0gbWFyY19maWVsZF82MDAgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBpbm5lcl9qb2luKC4scGJsX3ZpYWYsYnkgPSBjKCJuYW1lIiA9ICJCTl9uYW1lIikpICU+JQ0KICBzZWxlY3QoMTozKSAlPiUNCiAgbGVmdF9qb2luKC4sdHdvcmNhX2lfZHppYWwsYnkgPSAicGJsX2lkIikgJT4lDQogIHNlbGVjdChpZCxvc29iYV9wYmxfZHppYWxfaWRfbmFtZSkgJT4lDQogIGdyb3VwX2J5KGlkKSAlPiUNCiAgbXV0YXRlKG9zb2JhX2JuX3RlbWF0ID0gcGFzdGUodW5pcXVlKG9zb2JhX3BibF9kemlhbF9pZF9uYW1lKSxjb2xsYXBzZSA9ICJ+IikpICU+JQ0KICBzZWxlY3QoLW9zb2JhX3BibF9kemlhbF9pZF9uYW1lKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKQ0KDQpibl9rcyA8LSBibl9rcyAlPiUNCiAgZnVsbF9qb2luKC4sb3NvYmFfYm5fMTAwX3BibCxieSA9ICJpZCIpICU+JQ0KICBmdWxsX2pvaW4oLixvc29iYV9ibl82MDBfcGJsLGJ5ID0gImlkIikNCg0KI2JlenBpZWN6bmlrIQ0KI3NwcmF3ZHppxIcNCiNqZcWbbGkgb2JpZWt0IGJlenBpZWN6bmlrIGLEmWR6aWUgbWlhxYIgamFraWVrb2x3aWVrIHdpZXJzemUsIHRvIG96bmFjemEsIMW8ZSB3IHBsaWt1ICJtYXBvd2FuaWVfb3NvYl9ibl9wYmwiIGplc3Qgd2llcnN6IHogdHfDs3JjxIUsIGt0w7NyZWdvIG5pZSBtYSB3IGJhemllIGx1YiBqZWdvIGlkZW50eWZpa2F0b3IgamVzdCBixYLEmWRueQ0KI2plxZtsaSBvYmlla3QgYmV6cGllY3puaWsgamVzdCBwdXN0eSAtIHRvIHdzenlzdGtvIG9rZWoNCiMgc3ByYXdkeiBjenkgaWQgdHdvcmN5IHoga3RvcmVqcyB0YWJlbGkgbmEgZHlza3UgaXN0bmllamUgdyBiYXppZSBvcmFjbGUsIGplc2xpIG5pZSwgd2tsZWogaWQgdHdvcmN5IHogb3JhY2xhIGRvIHRhYmVsaSBsdWIgLSBqZcWbbGkgbmllIG1hIHRha2llZ28gdHfDs3JjeSB3IGJhemllIHVzdcWEIHdpZXJzeiB3IHRhYmVsaS4gTmFzdMSZcG5pZSBkb3Bpc3ogZnJhZ21lbnQga29kdSwgYnkgdXN1bsSFxIcga29sdW1ueSBvc29iYV9ibl9hdXRvciBpIG9zb2JhX2JuX3RlbWF0IChwbyB0ZWogb3BlcmFjamkgdXN1xYQgZG9waXNhbnkga29kKSBpIHVydWNob20gY2h1bmsgcG9ub3duaWUNCg0KIyBibl9rcyA8LSBibl9rcyAlPiUNCiMgICBzZWxlY3QoLW9zb2JhX2JuX2F1dG9yLC1vc29iYV9ibl90ZW1hdCkNCg0KYmV6cGllY3puaWsgPC0gYm5fa3MgJT4lIA0KICBmaWx0ZXIob3NvYmFfYm5fYXV0b3I9PSJOQSIpDQpjaHVuazIgPC0gYm5fa3MNCmBgYA0KDQpgYGB7ciBkYWxzemUgcHJ6eWdvdG93YW5pZSB6YmlvcnUgZG8gaW1wb3J0dSAtIFVLRCwgc8WCb3dhIGtsdWN6b3dlLCBwb2xvbmlraX0NCiN3c2themFuaWUgaW50ZXJlc3VqxIVjeWNoIFBCTCBkemllZHppbiB3aWVkenkgcG8gVUtEIGkgb2tyZcWbbGVuaWUgdHlwdSBVS0QNCmJuX2tzIDwtIGNodW5rMiAlPiUNCiAgbXV0YXRlKGR6aWVkemluYV9QQkwgPSBpZmVsc2Uoc3RyX2RldGVjdChYMDgwLCIoPzw9XFwkYXw6fFxcW3xcXCt8XFwoKSg4MikiKSwidWtkX2xpdCIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfZGV0ZWN0KFgwODAsIig/PD1cXCRhfDp8XFxbfFxcKykoNzkxKSIpfHN0cl9kZXRlY3QoWDA4MCwiKD88PVxcJGF8OikoNzkyKSIpfHN0cl9kZXRlY3QoWDA4MCwiXFwkYTdcXC4wOSIpLCJ1a2RfdGZydHYiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9kZXRlY3QoWDA4MCwiKD88PVxcJGEwMSkoXFwofFxcL3wyfDR8NXw5KSIpfHN0cl9kZXRlY3QoWDA4MCwiKD88PVxcJGF8XFxbXSkoMDUwKSIpfHN0cl9kZXRlY3QoWDA4MCwiKD88PVxcJGF8OnxcXFt8XFwrfFxcKCkoODExXFwuMTYyKSIpLCJ1a2RfYmlibGlvIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2RldGVjdChYMDgwLCJcXCRhMDAyIil8c3RyX2RldGVjdChYMDgwLCIoPzw9XFwkYXw6KSgzMDUpIil8c3RyX2RldGVjdChYMDgwLCIoPzw9XFwkYTM5fDozOSkoXFwoNDM4XFwpfDhcXC4yKSIpfHN0cl9kZXRlY3QoWDA4MCwiKD88PVxcJGF8OikoOTI5W15cXC5dMDUxKSIpfHN0cl9kZXRlY3QoWDA4MCwiKD88PVxcJGF8OikoOTI5W15cXC5dMDUyKSIpLCJ1a2RfcG9ncmFuaWN6ZSIsImJlel91a2RfUEJMIikpKSkpDQoNCiNvZ3JhbmljemVuaWUgcmVrb3Jkw7N3IHogdWtkIGrEmXp5a293eW0NCmJpYmxpbyA8LSBibl9rcyAlPiUgDQogIHNlbGVjdChpZCwgWDAwOCwgWDAwOSwgWDAxNSwgWDA0MSwgWDA0NCwgWDA4MCwgWDEwMCwgWDI0NSwgWDI0NiwgWDI1MCwgWDI2MCwgWDMwMCwgWDM4MCwgWDM4NiwgWDQ5MCwgWDUwMCwgWDUwMSwgWDU0NiwgWDYwMCwgWDY1MCwgWDY1NSwgWDcwMCwgWDcxMCwgWDgwMCwgWDgzMCwgcm9rLCBCTl9VUkwsIG9zb2JhX2JuX2F1dG9yLCBvc29iYV9ibl90ZW1hdCwgZHppZWR6aW5hX1BCTCkgJT4lIA0KICBmaWx0ZXIoZHppZWR6aW5hX1BCTD09InVrZF9iaWJsaW8iKQ0KZG9icmVfYmlibGlvIDwtIGJpYmxpbyAlPiUgDQogIGZpbHRlcighZ3JlcGwoIlBvZHLEmWN6bmlraSBkbGEgZHppZWNpfFBvZHLEmWN6bmlraSBkbGEgc3prw7PFgiBwb2RzdGF3b3d5Y2giLFg2NTUpLA0KICAgICAgICAgIWdyZXBsKCJzemtvxYJ5IHBvZHN0YXdvd2V8cm96bcOzd2tpfG5hdWN6YW5pZXxsb2dvcGVkaWEiLFg2NTAsaWdub3JlLmNhc2UgPSBUUlVFKSwNCiAgICAgICAgICFncmVwbCgiODExXFwuMTYyXFwuMVxcKDA3NVxcLjJcXCl8ODExXFwuMTYyXFwnMjRcXCgwNzhcXCkiLFgwODApLA0KICAgICAgICAgIWdyZXBsKCLEh3dpY3plbmlhIGkgemFkYW5pYXxwb3JhZG5pa2kgZGxhIG5hdWN6eWNpZWxpfHPFgm93bmlrLio/XFwtcG9sc2tpfHPFgm93bmlrIHBvbHNrb1xcLXxTxYJvd25pa2kgZGxhIGR6aWVjaSIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpLA0KICAgICAgICAgIShncmVwbCgiUG9kcsSZY3puaWtpIixYNjU1KSZncmVwbCgiS3N6dGHFgmNlbmllIG5hdWN6eWNpZWxpIixYNjUwKSkpDQpkb2JyZV9iaWJsaW8yIDwtIGJpYmxpbyAlPiUgDQogIGZpbHRlcighKGlzLm5hKG9zb2JhX2JuX2F1dG9yKSZpcy5uYShvc29iYV9ibl90ZW1hdCkpKQ0KZG9icmVfYmlibGlvIDwtIGRvYnJlX2JpYmxpbyAlPiUgDQogIGJpbmRfcm93cyhkb2JyZV9iaWJsaW8yICU+JSBmaWx0ZXIoaWQgJW5vdGluJSBkb2JyZV9iaWJsaW8kaWQpKQ0KemxlX2JpYmxpbyA8LSBiaWJsaW8gJT4lIA0KICBmaWx0ZXIoaWQgJW5vdGluJSBkb2JyZV9iaWJsaW8kaWQpDQpibl9rcyRkemllZHppbmFfUEJMW2JuX2tzJGlkICVpbiUgemxlX2JpYmxpbyRpZF0gPC0gTkENCg0KI3dza2F6YW5pZSBpbnRlcmVzdWrEhWN5Y2ggUEJMIHJla29yZMOzdyBiZXogVUtELCBrdMOzcmUgc8SFIHcga2x1Y3p1IFBCTA0KYmV6X3VrZF9hbGVfUEJMIDwtIGJuX2tzICU+JQ0KICBzZWxlY3QoaWQsIFgwODAsIFg2NTAsIFg2NTUsIG9zb2JhX2JuX2F1dG9yLCBvc29iYV9ibl90ZW1hdCwgZHppZWR6aW5hX1BCTCkgJT4lDQogIGZpbHRlcihkemllZHppbmFfUEJMID09ICJiZXpfdWtkX1BCTCImWDA4MD09IiImaXMubmEob3NvYmFfYm5fYXV0b3IpJmlzLm5hKG9zb2JhX2JuX3RlbWF0KSkgJT4lDQogIG11dGF0ZShiZXpfdWtkX2FsZV9QQkwgPSBncmVwbCgibGl0ZXJhdHxsaXRlcmFjfHBpc2FyfGJhamt8ZHJhbWF0fGVwaWdyYW1hdHxlc2VqfGZlbGlldG9ufGZpbG18a29tZWRpfG5vd2VsfG9wb3dpYWRhbml8cGFtacSZdG5pa3xwb2VtaWtzfHBvZXpqfHBvd2llxZvEh3xwcm96YXxyZXBvcnRhxbx8c2F0eXJ8d3Nwb21uaWVuaXxTY2VuYXJpdXN6ZSB6YWrEmcSHfFBvZHLEmWN6bmlraSBkbGEgZ2ltbmF6asOzd3x0ZWF0cnxOYWdyb2R8YWZvcnl6bXxiYcWbxYR8YmHFm25pZXxwb2xvbmlqbnxkaWFsb2dpfGZhbnRhc3R5a2EgbmF1a293YXxsZWdlbmR8cGllxZvFhHxwb2VtYXR8cHJ6eXBvd2llxZt8aG9ub3JpcyBjYXVzYXxmaWxvbG9naXxraW5vIHBvbHNraWV8cGllxZtuaXxpbnRlcnByZXRhY2oiLFg2NTAsIGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoImxpdGVyYXR8bGl0ZXJhY3xwaXNhcnxiYWprfGRyYW1hdHxlcGlncmFtYXR8ZXNlanxmZWxpZXRvbnxmaWxtfGtvbWVkaXxub3dlbHxvcG93aWFkYW5pfHBhbWnEmXRuaWt8cG9lbWlrc3xwb2V6anxwb3dpZcWbxId8cHJvemF8cmVwb3J0YcW8fHNhdHlyfHdzcG9tbmllbml8U2NlbmFyaXVzemUgemFqxJnEh3xQb2RyxJljem5pa2kgZGxhIGdpbW5hemrDs3d8dGVhdHJ8TmFncm9kfGFmb3J5em18YmHFm8WEfGJhxZtuaWV8cG9sb25pam58ZGlhbG9naXxmYW50YXN0eWthIG5hdWtvd2F8bGVnZW5kfHBpZcWbxYR8cG9lbWF0fHByenlwb3dpZcWbfGhvbm9yaXMgY2F1c2F8Zmlsb2xvZ2l8a2lubyBwb2xza2llfHBpZcWbbml8aW50ZXJwcmV0YWNqIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSkpICU+JQ0KICBmaWx0ZXIoYmV6X3VrZF9hbGVfUEJMID09IFRSVUUpICU+JQ0KICBzZWxlY3QoaWQpICU+JQ0KICBtdXRhdGUoYmV6X3VrZF9hbGVfUEJMID0gInRhayIpDQoNCmJuX2tzIDwtIGJuX2tzICU+JQ0KICBmdWxsX2pvaW4oLixiZXpfdWtkX2FsZV9QQkwsYnkgPSAiaWQiKQ0KDQojQmlibGlhDQpiaWJsaWEgPC0gYm5fa3MgJT4lIA0KICBmaWx0ZXIoZ3JlcGwoImJpYmxpYSIsIFg2MzAsIGlnbm9yZS5jYXNlID0gVFJVRSksIA0KICAgICAgICAgZ3JlcGwoImFuYWxpemEgaSBpbnRlcnByZXRhY2phfGVkeWNqYSBrcnl0eWN6bmF8bWF0ZXJpYcWCeSBrb25mZXJlbmN5am5lIiwgWDY1NSwgaWdub3JlLmNhc2UgPSBUUlVFKSkgJT4lIA0KICBzZWxlY3QoaWQpICU+JSANCiAgbXV0YXRlKGN6eV9iaWJsaWEgPSAidGFrIikNCg0KYm5fa3MgPC0gYm5fa3MgJT4lDQogIGZ1bGxfam9pbihiaWJsaWEsYnkgPSAiaWQiKQ0KDQojd3Nwb21uaWVuaWEscGFtacSZdG5pa2ksbGl0ZXJhdHVyYSBwb2Ryw7PFvG5pY3phLHJlcG9ydGHFvA0Kd3Nwb21uaWVuaWEgPC0gYm5fa3MgJT4lDQogIG11dGF0ZShjenlfd3Nwb21uaWVuaWFfcmVwb3J0YXogPSBpZmVsc2Uoc3RyX2RldGVjdChYNjU1LCJQYW1pxJl0bmlraSBpIHdzcG9tbmllbmlhIil8c3RyX2RldGVjdChYNjU1LCJMaXRlcmF0dXJhIHBvZHLDs8W8bmljemEiKXxzdHJfZGV0ZWN0KFg2NTUsIlBhbWnEmXRuaWtpIil8c3RyX2RldGVjdChYNjU1LCJSZXBvcnRhxbwiKXxzdHJfZGV0ZWN0KFg2NTUsIlJlbGFjamEgeiBwb2Ryw7PFvHkiKSwidGFrIixOQSkpICU+JQ0KICBzZWxlY3QoaWQsY3p5X3dzcG9tbmllbmlhX3JlcG9ydGF6KSAlPiUNCiAgdW5pcXVlKCkNCmJuX2tzIDwtIGJuX2tzICU+JQ0KICBmdWxsX2pvaW4oLix3c3BvbW5pZW5pYSxieSA9ICJpZCIpDQoNCiNzxYJvd2EgbGl0ZXJhY2tpZSB3IHBvbHUgMjQ1DQpyZWtvcmR5X3Nsb3dhIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICBmcm9tIGJuX2tzIGENCiAgICAgICAgICAgICAgICAgICAgd2hlcmUgTE9XRVIoYS5YMjQ1KSBsaWtlICgnJSd8fCdwaXNhcid8fCclJykNCiAgICAgICAgICAgICAgICAgICBvciBMT1dFUihhLlgyNDUpIGxpa2UgKCclJ3x8J2xpdGVyYXQnfHwnJScpDQogICAgICAgICAgICAgICAgICAgb3IgTE9XRVIoYS5YMjQ1KSBsaWtlICgnJSd8fCdsaXRlcmFjJ3x8JyUnKQ0KICAgICAgICAgICAgICAgICAgIG9yIExPV0VSKGEuWDI0NSkgbGlrZSAoJyUnfHwndGVhdHInfHwnJScpDQogICAgICAgICAgICAgICAgICAgb3IgTE9XRVIoYS5YMjQ1KSBsaWtlICgnJSd8fCdmaWxtJ3x8JyUnKQ0KICAgICAgICAgICAgICAgICAgIG9yIExPV0VSKGEuWDI0NSkgbGlrZSAoJyUnfHwnZHJhbWF0J3x8JyUnKQ0KICAgICAgICAgICAgICAgICAgIG9yIExPV0VSKGEuWDI0NSkgbGlrZSAoJyUnfHwnaW50ZXJwcmV0YWNqJ3x8JyUnKSIpICU+JQ0KICBzZWxlY3QoaWQpICU+JQ0KICBtdXRhdGUoc2xvd2FfbGl0ZXJhY2tpZSA9ICJ0YWsiKSAlPiUNCiAgdW5pcXVlKCkNCmJuX2tzIDwtIGJuX2tzICU+JQ0KICBmdWxsX2pvaW4oLixyZWtvcmR5X3Nsb3dhLGJ5ID0gImlkIikNCg0KYm5fb2sgPC0gYm5fa3MgJT4lDQogIGZpbHRlcighKChpcy5uYShvc29iYV9ibl9hdXRvcikmaXMubmEob3NvYmFfYm5fdGVtYXQpKSZkemllZHppbmFfUEJMPT0iYmV6X3VrZF9QQkwiJmlzLm5hKGJlel91a2RfYWxlX1BCTCkmaXMubmEoY3p5X3dzcG9tbmllbmlhX3JlcG9ydGF6KSZpcy5uYShzbG93YV9saXRlcmFja2llKSZpcy5uYShjenlfYmlibGlhKSkpDQoNCiNpbnRlcnByZXRhY2plIG5pZWxpdGVyYWNraWUNCnpsZV9pbnRlcnByZXRhY2plIDwtIGJuX29rICU+JSANCiAgZmlsdGVyKGdyZXBsKCJpbnRlcnByZXRhY2oiLFgyNDUsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgiaW50ZXJwcmV0YWNqIixYNjUwLGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoImludGVycHJldGFjaiIsWDI0NSxpZ25vcmUuY2FzZSA9IFRSVUUpKSAlPiUgDQogIGZpbHRlcihncmVwbCgiXFwkYTMzNnxcXCRhMzQyfFxcJGEzMnxcXCRhNTUxfFxcJGE2MTZ8XFwkYTE1OVxcLjk2MSIsWDA4MCl8Z3JlcGwoInByYXdufGhhbmRsfGhhbmRlbHxrb2Rla3N8cHJhY3x1c3Rhd3xhZG1pbmlzdHJhY3xzcMOzxYJrYXxzcMOzxYJla3xwcmF3YXxwb2RhdGsiLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgicHJhd258aGFuZGx8aGFuZGVsfGtvZGVrc3xwcmFjfHVzdGF3fGFkbWluaXN0cmFjfHNww7PFgmthfHNww7PFgmVrfHByYXdhfHBvZGF0ayIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJwcmF3bnxoYW5kbHxoYW5kZWx8a29kZWtzfHVzdGF3fGFkbWluaXN0cmFjfHNww7PFgmthfHNww7PFgmVrfHByYXdhfHBvZGF0ayIsWDI0NSxpZ25vcmUuY2FzZSA9IFRSVUUpKQ0KDQpibl9vayA8LSBibl9vayAlPiUgDQogIGZpbHRlcihpZCAlbm90aW4lIHpsZV9pbnRlcnByZXRhY2plJGlkKQ0KDQojdXN1d2FuaWUgemR1Ymxvd2FueWNoIGtzacSFxbxlaw0KIzAyMA0KbWFyY19maWVsZF8wMjAgPC0gYm5fb2sgJT4lDQogIHNlbGVjdChpZCxYMDIwKSU+JQ0KICBmaWx0ZXIoWDAyMCE9IiIpICU+JQ0KICBtdXRhdGUoWDAyMD1zdHJfcmVwbGFjZV9hbGwoWDAyMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMDIwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgwMjAhPSIiKSAlPiUNCiAgbXV0YXRlKFgwMjA9c3RyX3JlbW92ZV9hbGwoWDAyMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMDIwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGJuX29rJFgwMjAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8wMjApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMDIwPC1jYmluZChtYXJjX2ZpZWxkXzAyMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzAyMCRYMDIwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMDIwJFgwMjAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMDIwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMDIwJFgwMjApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzAyMCRYMDIwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzAyMCA8LSBtYXJjX2ZpZWxkXzAyMCAlPiUNCiAgc2VsZWN0KGlkLGlzYm49YCRhYCkNCg0KZGlzdGFuY2UxIDwtIGJuX29rICU+JQ0KICBmaWx0ZXIoIWdyZXBsKCJcXCRuIixYMjQ1KSkgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMDIwLGJ5PSJpZCIpICU+JQ0KICBtdXRhdGUocG9yb3duYW5pZSA9IHBhc3RlKGlzYm4sc3Vic3RyKHN0cl90b19sb3dlcihzdHJfcmVwbGFjZV9hbGwoWDI0NSwgIlxcVyIsICIiKSksNCwxNCksc3RyX2V4dHJhY3QoWDMwMCwiKD88PVxcJGEpKC4qPykoPz0sfCApIiksc2VwID0gInwiKSkNCg0KY291bnQgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkaXN0YW5jZTEkcG9yb3duYW5pZSkpDQoNCmRpc3RhbmNlMSA8LSBtZXJnZShkaXN0YW5jZTEsY291bnQsYnkueCA9ICJwb3Jvd25hbmllIixieS55ID0gIlZhcjEiLGFsbC54ID0gVFJVRSkgJT4lDQogIHNlbGVjdChwb3Jvd25hbmllLEZyZXEsMjoxNTUpICU+JQ0KICBhcnJhbmdlKC1GcmVxLHBvcm93bmFuaWUpICU+JQ0KICBzZWxlY3QocG9yb3duYW5pZSxGcmVxLGlkKSAlPiUNCiAgY1NwbGl0KC4sInBvcm93bmFuaWUiLHNlcCA9ICJ8IixkaXJlY3Rpb24gPSAid2lkZSIpICU+JSANCiAgYXJyYW5nZShwb3Jvd25hbmllXzIscG9yb3duYW5pZV8zLHBvcm93bmFuaWVfMSwtRnJlcSxpZCkNCmNvdW50IDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZGlzdGFuY2UxJHBvcm93bmFuaWVfMixkaXN0YW5jZTEkcG9yb3duYW5pZV8zKSkgJT4lIA0KICBmaWx0ZXIoRnJlcT4wKQ0KZGlzdGFuY2UxIDwtIGRpc3RhbmNlMSAlPiUgDQogIGxlZnRfam9pbiguLGNvdW50LGJ5PWMoInBvcm93bmFuaWVfMiI9IlZhcjEiLCJwb3Jvd25hbmllXzMiPSJWYXIyIikpICU+JSANCiAgYXJyYW5nZShwb3Jvd25hbmllXzIscG9yb3duYW5pZV8zLC1GcmVxLnkscG9yb3duYW5pZV8xLC1GcmVxLnksaWQpICU+JSANCiAgZ3JvdXBfYnlfYXQodmFycyg0OjYpKSAlPiUgDQogIGZpbGwocG9yb3duYW5pZV8xKSAlPiUgDQogIHVuZ3JvdXAoKSAlPiUgDQogIHVuaXF1ZSgpICU+JSANCiAgc2VsZWN0KC1GcmVxLnkpICU+JSANCiAgcmVuYW1lKEZyZXEgPSBGcmVxLngpDQoNCiNwb3N6dWthbmllIGR5c3RhbnN1IExldmVuc2h0ZWluYSA9PSAxIHByenkgdGFraW0gc2FteW0gSVNCTg0KZGlzdGFuY2UyIDwtIGRpc3RhbmNlMSAlPiUNCiAgZmlsdGVyKCFpcy5uYShwb3Jvd25hbmllXzEpKSAlPiUNCiAgZ3JvdXBfYnkocG9yb3duYW5pZV8xKSAlPiUNCiAgbXV0YXRlKEZyZXEgPSBwYXN0ZShGcmVxLGNvbGxhcHNlID0gInwiKSwNCiAgICAgICAgIGlkID0gcGFzdGUoaWQsY29sbGFwc2UgPSAifCIpLA0KICAgICAgICAgcG9yb3duYW5pZV8yID0gcGFzdGUocG9yb3duYW5pZV8yLGNvbGxhcHNlID0gInwiKSwNCiAgICAgICAgIHBvcm93bmFuaWVfMyA9IHBhc3RlKHBvcm93bmFuaWVfMyxjb2xsYXBzZSA9ICJ8IikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUoaWxlID0gc3RyX2NvdW50KHBvcm93bmFuaWVfMiwiXFx8IikrMSkgJT4lDQogIGFycmFuZ2UoLWlsZSkgJT4lDQogIG11dGF0ZShpZF9ncnVweSA9IDE6bGVuZ3RocyguKSkgJT4lDQogIGZpbHRlcihpbGU+MSkgJT4lDQogIGNTcGxpdCguLGMoIkZyZXEiLCJpZCIsInBvcm93bmFuaWVfMiIsInBvcm93bmFuaWVfMyIpLHNlcCA9ICJ8IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShpZCkpDQoNCnBlcm11dGF0aW9ucyA8LSBkYXRhLmZyYW1lKHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkNCnggPC0gMTptYXgoZGlzdGFuY2UyJGlkX2dydXB5KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICBkaXN0YW5jZTMgPC0gYXMudmVjdG9yKHVubGlzdChkaXN0YW5jZTIgJT4lIGZpbHRlcihpZF9ncnVweT09aSkgJT4lIHNlbGVjdChwb3Jvd25hbmllXzIpKSkNCiAgaXRlcmF0aW9uIDwtIGFzLmRhdGEuZnJhbWUocGVybXV0YXRpb25zKGRpc3RhbmNlMywyKSkgJT4lDQogICAgbXV0YXRlKGlkX2dydXB5ID0gaSkNCiAgeSA8LSAxOmxlbmd0aChpdGVyYXRpb24kVjEpDQogIGZvciAoaiBpbiB5KSB7DQogICAgcHJvZ3Jlc3MobWF0Y2goaix5KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHkpKQ0KICAgIGl0ZXJhdGlvbiRkaXN0YW5jZVtqXSA8LSBhZGlzdChpdGVyYXRpb24kVjFbal0saXRlcmF0aW9uJFYyW2pdKQ0KICB9DQogIHBlcm11dGF0aW9ucyA8LSByYmluZChwZXJtdXRhdGlvbnMsaXRlcmF0aW9uKQ0KfQ0KDQpwZXJtdXRhdGlvbnMgPC0gcGVybXV0YXRpb25zICU+JQ0KICBmaWx0ZXIoZGlzdGFuY2U8PTEpDQoNCmRpc3RhbmNlMiA8LSBkaXN0YW5jZTIgJT4lDQogIGZpbHRlcihpZF9ncnVweSAlaW4lIHBlcm11dGF0aW9ucyRpZF9ncnVweSkgJT4lDQogIHNlbGVjdChpZCxpZF9ncnVweSkNCiNwb8WCxIVjennEhyBkaXN0YW5jZTIgeiBkaXN0YW5jZTEsIMW8ZWJ5IHd5ZG9iecSHIHBlxYJuxIUgbGlzdMSZIHpkdWJsb3dhbnljaCBrc2nEhcW8ZWsNCmR1YmxlX2tzaWF6ZWsgPC0gZGlzdGFuY2UxICU+JQ0KICB1bml0ZSgicG9yb3duYW5pZSIsIHBvcm93bmFuaWVfMTpwb3Jvd25hbmllXzMsIHNlcCA9ICJ8IikgJT4lDQogIGZpbHRlcihGcmVxPjEpICU+JQ0KICBmdWxsX2pvaW4oLixkaXN0YW5jZTIsYnk9ImlkIikNCg0KZHVibGVfa3NpYXplayRzYW1lIDwtIGN1bXN1bSghZHVwbGljYXRlZChkdWJsZV9rc2lhemVrJHBvcm93bmFuaWUpKQ0KDQpkdWJsZV9rc2lhemVrIDwtIGR1YmxlX2tzaWF6ZWsgJT4lDQogIGFycmFuZ2UoaWRfZ3J1cHksc2FtZSkgJT4lDQogIG11dGF0ZShpZF9ncnVweV9kdWJsaSA9IGlmZWxzZSghaXMubmEoaWRfZ3J1cHkpLGFzLmNoYXJhY3RlcihpZF9ncnVweSkscGFzdGUoIngiLHNhbWUsc2VwID0gIiIpKSkgJT4lDQogIHNlbGVjdChpZCxpZF9ncnVweV9kdWJsaSkgJT4lDQogIGFycmFuZ2UoaWRfZ3J1cHlfZHVibGkpDQoNCmR1YmxlX2tzaWF6ZWskaWRfZ3J1cHlfZHVibGkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKGR1YmxlX2tzaWF6ZWskaWRfZ3J1cHlfZHVibGkpKQ0KI3V6dXBlxYJuaWVuaWUgY2HFgmVnbyB6YmlvcnUgbyBpbmZvcm1hY2rEmSBvIGR1Ymx1LCB3eWRvYnljaWUgZHVibGkgZG8gb3NvYm5lZ28gcGxpa3UgaSB1c3VuaWVjaWUgaWNoIHogZ8WCw7N3bmVnbyBwbGlrdSB6IHJla29yZGFtaSBibjsgd3NrYXphbmllIGxpc3R5IGludGVyZXN1asSFY3ljaCBww7NsDQpibl9vayA8LSBibl9vayAlPiUNCiAgbGVmdF9qb2luKC4sZHVibGVfa3NpYXplayxieT0iaWQiKSAlPiUNCiAgc2VsZWN0KGlkLCBYMDA4LCBYMDA5LCBYMDE1LCBYMDQxLCBYMDQ0LCBYMDgwLCBYMTAwLCBYMjQ1LCBYMjQ2LCBYMjUwLCBYMjYwLCBYMzAwLCBYMzgwLCBYMzg2LCBYNDkwLCBYNTAwLCBYNTAxLCBYNTQ2LCBYNjAwLCBYNjUwLCBYNjU1LCBYNzAwLCBYNzEwLCBYODAwLCBYODMwLCByb2ssIEJOX1VSTCwgb3NvYmFfYm5fYXV0b3IsIG9zb2JhX2JuX3RlbWF0LCBkemllZHppbmFfUEJMLCBiZXpfdWtkX2FsZV9QQkwsIGN6eV93c3BvbW5pZW5pYV9yZXBvcnRheiwgc2xvd2FfbGl0ZXJhY2tpZSwgY3p5X2JpYmxpYSwgaWRfZ3J1cHlfZHVibGkpDQoNCmR1YmxlX2tzaWF6ZWsgPC0gYm5fb2sgJT4lDQogIGZpbHRlcighaXMubmEoaWRfZ3J1cHlfZHVibGkpKSAlPiUNCiAgYXJyYW5nZShpZF9ncnVweV9kdWJsaSkNCg0KYm5fb2sgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihpcy5uYShpZF9ncnVweV9kdWJsaSkpDQojd3Bpc2FuaWUgdyB6ZHVibG93YW5lIHJla29yZHkgamFrIG5handpxJlrc3plaiBpbG/Fm2NpIGRhbnljaCAoc3VtYSB3c3p5c3RraWNoIGR1YmxpKQ0KZHVibGVfa3NpYXplayA8LSBkdWJsZV9rc2lhemVrICU+JQ0KICBhcnJhbmdlKGlkX2dydXB5X2R1YmxpLC1uY2hhcihYMDE1KSkNCmR1YmxlX2tzaWF6ZWtbaXMubmEoZHVibGVfa3NpYXplayldIDwtICIiDQpkdWJsZV9uYXByYXdpb25lIDwtIGRhdGEuZnJhbWUoc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQ0KeCA8LSAxOm1heChkdWJsZV9rc2lhemVrJGlkX2dydXB5X2R1YmxpKQ0KeSA8LSBjKDQ6MjcsMjk6MzQpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIGl0ZXJhdGlvbiA8LSBkdWJsZV9rc2lhemVrICU+JQ0KICAgIGZpbHRlcihpZF9ncnVweV9kdWJsaT09aSkNCiAgZm9yIChqIGluIHkpIHsNCiAgICBpZiAoaj09MzApIHsNCiAgICAgIGl0ZXJhdGlvblssal0gPC0gaXRlcmF0aW9uWyxqXVtuY2hhcihpdGVyYXRpb25bLGpdKT09bWluKG5jaGFyKGl0ZXJhdGlvblssal0pKV1bMV0NCiAgICB9IGVsc2Ugew0KICAgICAgICBpdGVyYXRpb25bLGpdIDwtIGl0ZXJhdGlvblssal1bbmNoYXIoaXRlcmF0aW9uWyxqXSk9PW1heChuY2hhcihpdGVyYXRpb25bLGpdKSldWzFdDQogICAgICB9DQogIH0NCiAgZHVibGVfbmFwcmF3aW9uZSA8LSByYmluZChkdWJsZV9uYXByYXdpb25lLGl0ZXJhdGlvbikNCn0NCiNwb3pvc3Rhd2llbmllIHBvamVkeW5jenljaCB3aWVyc3p5IGRsYSBrc2nEhcW8ZWsNCmR1YmxlX25hcHJhd2lvbmUgPC0gZHVibGVfbmFwcmF3aW9uZVshZHVwbGljYXRlZChkdWJsZV9uYXByYXdpb25lJGlkX2dydXB5X2R1YmxpKSxdDQpkdWJsZV9uYXByYXdpb25lIDwtIGR1YmxlX25hcHJhd2lvbmUgJT4lDQogIG11dGF0ZShvc29iYV9ibl9hdXRvciA9IGlmZWxzZShvc29iYV9ibl9hdXRvciE9IiIsYXMuY2hhcmFjdGVyKG9zb2JhX2JuX2F1dG9yKSxOQSksDQogICAgICAgICBvc29iYV9ibl90ZW1hdCA9IGlmZWxzZShvc29iYV9ibl90ZW1hdCE9IiIsYXMuY2hhcmFjdGVyKG9zb2JhX2JuX3RlbWF0KSxOQSksDQogICAgICAgICBkemllZHppbmFfUEJMID0gaWZlbHNlKGR6aWVkemluYV9QQkwhPSIiLGFzLmNoYXJhY3RlcihkemllZHppbmFfUEJMKSxOQSksDQogICAgICAgICBiZXpfdWtkX2FsZV9QQkwgPSBpZmVsc2UoYmV6X3VrZF9hbGVfUEJMIT0iIixhcy5jaGFyYWN0ZXIoYmV6X3VrZF9hbGVfUEJMKSxOQSksDQogICAgICAgICBjenlfd3Nwb21uaWVuaWFfcmVwb3J0YXogPSBpZmVsc2UoY3p5X3dzcG9tbmllbmlhX3JlcG9ydGF6IT0iIixhcy5jaGFyYWN0ZXIoY3p5X3dzcG9tbmllbmlhX3JlcG9ydGF6KSxOQSksDQogICAgICAgICBzbG93YV9saXRlcmFja2llID0gaWZlbHNlKHNsb3dhX2xpdGVyYWNraWUhPSIiLGFzLmNoYXJhY3RlcihzbG93YV9saXRlcmFja2llKSxOQSksKQ0KI3BvxYLEhWN6ZW5pZSB1bmlrYXRvd3ljaCBrc2nEhcW8ZWsgeiBkdWJsaSB6IGNhxYJ5bSB6YmlvcmVtDQpibl9vayA8LSBibl9vayAlPiUNCiAgYmluZF9yb3dzKC4sZHVibGVfbmFwcmF3aW9uZSkgJT4lDQogIHNlbGVjdCgtaWRfZ3J1cHlfZHVibGkpDQoNCiN1c3VuacSZY2llIHphZ3Jhbmljem55Y2ggemFwaXPDs3csIGt0w7NyZSBuaWUgc8SFIHBvbG9uaWthbWkgDQojbmEgcG9kc3Rhd2llIGJyYWt1IHd5c3TEhXBpZcWEIGZyYXp5ICJwb2wiIHcgcG9sYWNoIE1BUkMNCm5pZV9wb2xvbmlraSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKGlmIChYNTAxPT0iIikgIWdyZXBsKCJwbCIsc3Vic3RyKFgwMDgsMTYsMTgpKSkgJT4lDQogIGZpbHRlcighZ3JlcGwoInBvbCIsc3Vic3RyKFgwMDgsMzYsMzgpKSkgJT4lDQogIGZpbHRlcighZ3JlcGwoInBvbCIsWDA0MSkpICU+JQ0KICBmaWx0ZXIoIWdyZXBsKCJwbCIsWDA0NCkpICU+JQ0KICBmaWx0ZXIoIWdyZXBsKCJwb2wiLFg1MDAsaWdub3JlLmNhc2UgPSBUUlVFKSkgJT4lDQogIGZpbHRlcighZ3JlcGwoInBvbCIsWDUwMSxpZ25vcmUuY2FzZSA9IFRSVUUpKSAlPiUNCiAgZmlsdGVyKCFncmVwbCgicG9sIixYNTQ2LGlnbm9yZS5jYXNlID0gVFJVRSkpICU+JQ0KICBzZWxlY3QoaWQpICU+JQ0KICBtdXRhdGUoY3p5X3BvbG9uaWsgPSAibmllIikgJT4lDQogIHVuaXF1ZSgpDQoNCmJuX29rIDwtIGJuX29rICU+JQ0KICBmdWxsX2pvaW4oLixuaWVfcG9sb25pa2ksYnkgPSAiaWQiKSAlPiUNCiAgc2VsZWN0KGlkLCBYMDA4LCBYMDA5LCBYMDQxLCBYMDQ0LCBYMDgwLCBYMTAwLCBYMjQ1LCBYMjQ2LCBYMjUwLCBYMjYwLCBYMzAwLCBYMzgwLCBYMzg2LCBYNDkwLCBYNTAwLCBYNTAxLCBYNTAwLCBYNTQ2LCBYNjAwLCBYNjUwLCBYNjU1LCBYNzAwLCBYNzEwLCBYODAwLCBYODMwLCByb2ssIEJOX1VSTCwgb3NvYmFfYm5fYXV0b3IsIG9zb2JhX2JuX3RlbWF0LCBkemllZHppbmFfUEJMLCBiZXpfdWtkX2FsZV9QQkwsIGN6eV93c3BvbW5pZW5pYV9yZXBvcnRheiwgc2xvd2FfbGl0ZXJhY2tpZSwgY3p5X3BvbG9uaWssIGN6eV9iaWJsaWEpICU+JQ0KICB1bmlxdWUoKQ0KI3dza2F6YW5pZSBuaWVwb2xvbmlrw7N3IGkgdXN1bmnEmWNpZSB6ZSB6YmlvcnUNCm5pZV9wb2xvbmlraSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKGN6eV9wb2xvbmlrPT0ibmllIikgJT4lDQogIGZpbHRlcihpcy5uYShvc29iYV9ibl9hdXRvcil8aXMubmEob3NvYmFfYm5fdGVtYXQpfCEob3NvYmFfYm5fYXV0b3IgJWluJSBjKCIxNDh8SGFzxYJhIG9zb2Jvd2UgKGxpdGVyYXR1cmEgcG9sc2thKSIsIjQzMHxIYXPFgmEgb3NvYm93ZSAoTHVkemllIHRlYXRydSBpIGZpbG11KSIpKXwhKG9zb2JhX2JuX3RlbWF0ICVpbiUgYygiMTQ4fEhhc8WCYSBvc29ib3dlIChsaXRlcmF0dXJhIHBvbHNrYSkiLCI0MzB8SGFzxYJhIG9zb2Jvd2UgKEx1ZHppZSB0ZWF0cnUgaSBmaWxtdSkiKSkpDQpibl9vayA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgIGZyb20gYm5fb2sgYQ0KICAgICAgICAgICAgICAgd2hlcmUgYS5pZCBub3QgaW4gKHNlbGVjdCBiLmlkIGZyb20gbmllX3BvbG9uaWtpIGIpIikgJT4lDQogIHNlbGVjdCgtY3p5X3BvbG9uaWspDQoNCiN1c3VuacSZY2llIGtzacSFxbxlayB6YWJhd2VrLCBkbyBrb2xvcm93YW5pYSwgZGxhIG1hxYJ5Y2ggZHppZWNpLCB6IG5ha2xlamthbWksIGt0w7NyZSBuaWUgbWFqxIUgxbxhZG5lZ28gZGVza3J5cHRvcmEgZ2F0dW5rb3dlZ28NCmtzX3phYmF3a2kgPC0gYm5fb2sgJT4lIA0KICBmaWx0ZXIoKHN0cl9jb3VudChYNjU1LCJcXCRhIik9PTEmZ3JlcGwoIktzacSFxbxrYSB6YWJhd2thfEtzacSFxbxraSBkbGEgbWHFgnljaCBkemllY2l8S3NpxIXFvGthIGRvIGtvbG9yb3dhbmlhfEtzacSFxbxrYSB6IG5ha2xlamthbWl8S3NpxIXFvGtpIGRsYSBwcnplZHN6a29sYWvDs3d8V3lkYXduaWN0d2EgZGxhIGR6aWVjaSIsWDY1NSkpfHN0cl9jb3VudChYNjU1LCJcXCRhIik9PTImZ3JlcGwoIktzacSFxbxrYSBvYnJhemtvd2EiLFg2NTUpJmdyZXBsKCJLc2nEhcW8a2kgZGxhIG1hxYJ5Y2ggZHppZWNpIixYNjU1KXxzdHJfY291bnQoWDY1NSwiXFwkYSIpPT0yJmdyZXBsKCJLc2nEhcW8a2EgZG8ga29sb3Jvd2FuaWEiLFg2NTUpJmdyZXBsKCJQdWJsaWthY2plIGRsYSBkemllY2kiLFg2NTUpfHN0cl9jb3VudChYNjU1LCJcXCRhIik9PTImZ3JlcGwoIktzacSFxbxraSB6YWJhd2tpIixYNjU1KSZncmVwbCgiV3ljaW5hbmtpIixYNjU1KXxzdHJfY291bnQoWDY1NSwiXFwkYSIpPT0yJmdyZXBsKCJLc2nEhcW8a2kgZGxhIG1hxYJ5Y2ggZHppZWNpIixYNjU1KSZncmVwbCgiUHVibGlrYWNqZSBkbGEgZHppZWNpIixYNjU1KSkNCg0KYm5fb2sgPC0gc3FsZGYoInNlbGVjdCAqDQogICAgICAgICAgICAgICBmcm9tIGJuX29rIGENCiAgICAgICAgICAgICAgIHdoZXJlIGEuaWQgbm90IGluIChzZWxlY3QgYi5pZCBmcm9tIGtzX3phYmF3a2kgYikiKQ0KDQojIHVzdW5pxJljaWUga3NpxIXFvGVrIGRvdHljesSFY3ljaCBnbG90dG9keWRha3R5a2kNCmtzX2dsb3R0b2R5ZGFrdHlrYSA8LSBibl9vayAlPiUgDQogIGZpbHRlcihzdHJfZGV0ZWN0KHRvbG93ZXIoWDQ5MCksICJqxJl6eWsgcG9sc2tpIGRsYSBjdWR6b3ppZW1jw7N3fGN6eXRhaiBwbyBwb2xza3UgOiBtYXRlcmlhxYJ5IHBvbW9jbmljemUgZG8gbmF1a2kgasSZenlrYSBwb2xza2llZ28gamFrbyBvYmNlZ298dGVzdHkgb2fDs2xuZSBpIHNwZWNqYWxpc3R5Y3puZSB6IGrEmXp5a2EgcG9sc2tpZWdvIGpha28gb2JjZWdvfGt1bHR1cmEgaSBqxJl6eWsgcG9sc2tpIGRsYSBjdWR6b3ppZW1jw7N3fGN6eXRhaiBwbyBwb2xza3UiKSB8IHN0cl9kZXRlY3QodG9sb3dlcihYODMwKSwgImrEmXp5ayBwb2xza2kgZGxhIGN1ZHpvemllbWPDs3d8a3VsdHVyYSBpIGrEmXp5ayBwb2xza2kgZGxhIGN1ZHpvemllbWPDs3d8Y3p5dGFqIHBvIHBvbHNrdSIpKQ0KDQpibl9vayA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgIGZyb20gYm5fb2sgYQ0KICAgICAgICAgICAgICAgd2hlcmUgYS5pZCBub3QgaW4gKHNlbGVjdCBiLmlkIGZyb20ga3NfZ2xvdHRvZHlkYWt0eWthIGIpIikNCg0KY2h1bmszIDwtIGJuX29rDQpgYGANCg0KYGBge3IgYXV0b21hdHljem5lIHVzdW5pxJljaWUgSU5PIG5hIHBvZHN0YXdpZSB3Y3plxZtuaWVqc3p5Y2ggaW1wb3J0w7N3fQ0KYm5fb2sgPC0gY2h1bmszDQojcG9icmFuaWUgc3RhcnljaCBsaXN0IGtzacSFxbxlayB6IGltcG9ydHUNCiNha3R1YWxpemFjamEgLSB1enVwZcWCbmlqIG9zdGF0bmkgYnJha3VqxIVjeSB6YWltcG9ydG93YW55IHJvY3puaWsNCmxpc3R5XzIwMTEgPC0gc2hlZXRzX3JlYWQoc3MgPSAiMXMyMkNsUnhsclBIYUFYaV9uX0pKSDNtWDZ2S1l6S2pzS2JwSnBRenR4XzgiLCBzaGVldCA9ICJsaXN0YV9rc2lhemVrIikNCmxpc3R5XzIwMTAgPC0gc2hlZXRzX3JlYWQoc3MgPSAiMVZqZWcwSnNZSS04djlCLXhfeXl1aklobXc3VVI3TGs3cG9leHJITmRWek0iLCBzaGVldCA9ICJsaXN0YV9rc2lhemVrIikNCmxpc3R5XzIwMDkgPC0gc2hlZXRzX3JlYWQoc3MgPSAiMUdjNGdRU205YjRORFRReXNpYXV6VzlKYWM2eVAwb051RmJCOHV0TzRrUzQiLCBzaGVldCA9ICJsaXN0YV9rc2lhemVrIikNCmxpc3R5XzIwMDUgPC0gc2hlZXRzX3JlYWQoc3MgPSAiMUhrV2tYNjFzUVdrdFNYZjB2MHVQVjhqMkR3dVRvY2VzeUNKdUtUZGlzSVUiLCBzaGVldCA9ICJsaXN0YV9rc2lhemVrIikNCmxpc3R5XzIwMDYgPC0gc2hlZXRzX3JlYWQoc3MgPSAiMXplTXhfSWRzdW04Sm1sTTZHN0V1Zng5THhsb0hvQUh2OFYtTXk3MVZaZjQiLCBzaGVldCA9ICJsaXN0YV9rc2lhemVrIikNCmxpc3R5XzIwMDcgPC0gc2hlZXRzX3JlYWQoc3MgPSAiMTlpTDdZb0Q4dWctckxucHpTNkZENDZhUzJKMUJSZjRxTDVWeGxseXdDR0UiLCBzaGVldCA9ICJsaXN0YV9rc2lhemVrIikNCmxpc3R5XzIwMDggPC0gc2hlZXRzX3JlYWQoc3MgPSAiMVJzaFRlV2RYQkU3T3pPRWZvR3BMOUxqYl9HWERsR0RlUE5qVjFIS211T28iLCBzaGVldCA9ICJsaXN0YV9rc2lhemVrIikNCmxpc3R5XzIwMDQgPC0gc2hlZXRzX3JlYWQoc3MgPSAiMVJtRGlhOTdzNEI4Rjc0c1M3V2JwbnZfQTl6TWZyNHhUdmNEOWxldWtBZk0iLCBzaGVldCA9ICJsaXN0YV9rc2nEhcW8ZWsiKSAlPiUNCiAgbXV0YXRlKHR5cF9rc2lhemtpID0gTkEsIGxpbmsgPSBOQSwgbGlua18xID0gTkEsIHN0YXR1cyA9IE5BLCBibGFkX3dfaW1wb3JjaWVfdHl0dWx1ID0gTkEpICU+JQ0KICBzZWxlY3QocHJhY293bmlrLFpBX1pBUElTX0lELHR5cF9rc2lhemtpLCBsaW5rLCBsaW5rXzEsIHJvaywgc3RhdHVzLCBibGFkX3dfaW1wb3JjaWVfdHl0dWx1LCBYMTAwLCBYMjQ1LCBYNjUwLCBYNjU1LCBYMjQ2LCBYMjUwLCBYMjYwLCBYMzAwLCBYMzgwLCBYNDkwLCBYNTAwLCBYNTAxLCBYNTQ2LCBYNjAwLCBYNzAwLCBYMDQxLCBYMDgwKQ0KI3VqZWRub2xpY2VuaWUgMjAwNCBkbyB3em9ydSBww7PFum5pZWpzenljaCByb2N6bmlrw7NXDQpkbzIwMDQgPC0gUkpEQkM6OmRiR2V0UXVlcnkoUEJMLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3Qgei56YV96YXBpc19pZCwgei56YV9zdGF0dXNfaW1wDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBwYmxfemFwaXN5IHoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB6LnphX3V3YWdpIGxpa2UgJyVpbXBvcnQlMDIlJyIpDQpsaXN0eV8yMDA0IDwtIG1lcmdlKGxpc3R5XzIwMDQsZG8yMDA0LGJ5ID0gIlpBX1pBUElTX0lEIixhbGwueCA9IFRSVUUpICU+JQ0KICBtdXRhdGUoc3RhdHVzID0gWkFfU1RBVFVTX0lNUCkgJT4lDQogIHNlbGVjdCgtWkFfU1RBVFVTX0lNUCkgJT4lDQogIHNlbGVjdChwcmFjb3duaWssWkFfWkFQSVNfSUQsdHlwX2tzaWF6a2ksIGxpbmssIGxpbmtfMSwgcm9rLCBzdGF0dXMsIGJsYWRfd19pbXBvcmNpZV90eXR1bHUsIFgxMDAsIFgyNDUsIFg2NTAsIFg2NTUsIFgyNDYsIFgyNTAsIFgyNjAsIFgzMDAsIFgzODAsIFg0OTAsIFg1MDAsIFg1MDEsIFg1NDYsIFg2MDAsIFg3MDAsIFgwNDEsIFgwODApDQojemFwZXduaWVuaWUgdHljaCBzYW15Y2ggbmF6dyBrb2x1bW4NCiNha3R1YWxpemFjamEgLSB3cHJvd2Fkxbogd2llcnN6IGRsYSBvc3RhdG5pZWdvIHphaW1wb3J0b3dhbmVnbyByb2N6bmlrYQ0KY29sbmFtZXMobGlzdHlfMjAxMSkgPC0gbmFtZXMobGlzdHlfMjAwNCkNCmNvbG5hbWVzKGxpc3R5XzIwMTApIDwtIG5hbWVzKGxpc3R5XzIwMDQpDQpjb2xuYW1lcyhsaXN0eV8yMDA5KSA8LSBuYW1lcyhsaXN0eV8yMDA0KQ0KY29sbmFtZXMobGlzdHlfMjAwNSkgPC0gbmFtZXMobGlzdHlfMjAwNCkNCmNvbG5hbWVzKGxpc3R5XzIwMDYpIDwtIG5hbWVzKGxpc3R5XzIwMDQpDQpjb2xuYW1lcyhsaXN0eV8yMDA3KSA8LSBuYW1lcyhsaXN0eV8yMDA0KQ0KY29sbmFtZXMobGlzdHlfMjAwOCkgPC0gbmFtZXMobGlzdHlfMjAwNCkNCmxpc3R5XzIwMDQgPC0gbGlzdHlfMjAwNCAlPiUNCiAgbXV0YXRlKFg2NTUgPSBzdHJfcmVtb3ZlKHN0cl9yZXBsYWNlX2FsbChYNjU1LCIoXFwkYSkiLCJ8XFwxIiksIl5cXHwiKSwNCiAgICAgICAgIFg2NTAgPSBzdHJfcmVtb3ZlKHN0cl9yZXBsYWNlX2FsbChYNjUwLCIoXFwkYSkiLCJ8XFwxIiksIl5cXHwiKSkNCg0KI3d5em5hY3plbmllIGxpc3R5IDY1MCBpIDY1NSBkbyBhdXRvbWF0eWN6bmVnbyBJTk8gbmEgcG9kc3Rhd2llIHdjemXFm25pZWpzenljaCBpbXBvcnTDs3cgLSB1c3VuacSZdGUgc8SFIHR5bGtvIHRlIGRlc2tyeXB0b3J5LCBrdMOzcmUgbmllIG1hasSFIHp3acSFemt1IHogbGl0ZXJhdHVyxIUgcG9kbWlvdG93xIUNCnphcGlzeSA8LSBSSkRCQzo6ZGJHZXRRdWVyeShQQkwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCB6LnphX3phcGlzX2lkLCB6LnphX3N0YXR1c19pbXAsIHouemFfdXdhZ2ksIHouemFfYWRub3RhY2plDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBwYmxfemFwaXN5IHoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB6LnphX3V3YWdpIGxpa2UgJyVpbXBvcnQlJyIpICU+JQ0KICBtdXRhdGUocHJhY293bmlrX3BibCA9IHN0cl9leHRyYWN0KFpBX1VXQUdJLCAiKD88PWFrY2VwdHVqZTopKFtBLVpdKikiKSkgJT4lDQogIHNlbGVjdChaQV9aQVBJU19JRCxwcmFjb3duaWtfcGJsLFpBX1NUQVRVU19JTVAsWkFfQUROT1RBQ0pFKQ0KI2FrdHVhbGl6YWNqYSAtIGRvZGFqIGRvIHNrcnlwdHUgbGlzdMSZIHogb3N0YXRuaW0gYnJha3VqxIVjeW0gemFpbXBvcnRvd2FueW0gcm9jem5pa2llbQ0KZG9faW1wb3J0dV9OSUUgPC0gcmJpbmQobGlzdHlfMjAwNCxsaXN0eV8yMDA1LGxpc3R5XzIwMDYsbGlzdHlfMjAwNyxsaXN0eV8yMDA4LCBsaXN0eV8yMDA5LCBsaXN0eV8yMDEwLCBsaXN0eV8yMDExKSAlPiUNCiAgZnVsbF9qb2luKC4semFwaXN5LGJ5ID0gIlpBX1pBUElTX0lEIikgJT4lDQogIHNlbGVjdChYNjUwLFg2NTUsWkFfU1RBVFVTX0lNUCxaQV9BRE5PVEFDSkUpICU+JQ0KICBtdXRhdGUoWDY1MCA9IHN0cl9yZW1vdmVfYWxsKFg2NTAsIlxcXFw3IiksDQogICAgICAgICBYNjU1ID0gc3RyX3JlbW92ZV9hbGwoWDY1NSwiXFxcXDciKSwNCiAgICAgICAgIGpvaW50ID0gcGFzdGUoWDY1MCxYNjU1LHNlcCA9ICJ+IikpICU+JQ0KICBzZWxlY3QoWkFfU1RBVFVTX0lNUCxqb2ludCxaQV9BRE5PVEFDSkUpICU+JQ0KICBncm91cF9ieShqb2ludCkgJT4lDQogIG11dGF0ZShncnVwYSA9IHBhc3RlKFpBX1NUQVRVU19JTVAsY29sbGFwc2UgPSAiLCIpLA0KICAgICAgICAgWkFfQUROT1RBQ0pFID0gcGFzdGUoWkFfQUROT1RBQ0pFLGNvbGxhcHNlID0gIiwiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgc2VsZWN0KGpvaW50LCBncnVwYSxaQV9BRE5PVEFDSkUpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgZmlsdGVyKCFncmVwbCgicm96cGlzYW5hfHJvenBpc2HEh3xyb3pwaXNhbmlhIixaQV9BRE5PVEFDSkUpKSAlPiUgDQogIG11dGF0ZShpbGUgPSBzdHJfY291bnQoZ3J1cGEsIiwiKSsxKSAlPiUNCiAgZmlsdGVyKGdyZXBsKCJJTk8iLGdydXBhKSkgJT4lDQogIGZpbHRlcighZ3JlcGwoIklPS3xJTVB8SVBOfElQQyIsZ3J1cGEpKSAlPiUNCiAgbXV0YXRlKGN6eSA9IHN0cl9kZXRlY3Qoam9pbnQsIlxcJHlbXFxkLV0rIHdcXC4iKSkgJT4lDQogIGZpbHRlcihjenk9PUZBTFNFKSAlPiUNCiAgc2VsZWN0KGpvaW50KSAlPiUNCiAgbXV0YXRlKGpvaW50ID0gc3RyX3JlbW92ZV9hbGwoc3RyX3JlcGxhY2VfYWxsKGpvaW50LCIoXFwkYSkiLCJcXFxcIzdcXDEiKSwiIyIpKSAlPiUNCiAgbXV0YXRlKGRvX3d5cnp1Y2VuaWFfbmFfcG9kc3Rhd2llX0lOTyA9ICJ0YWsiKQ0KDQpibl9vayA8LSBibl9vayAlPiUNCiAgbXV0YXRlKFg2NTAgPSBpZmVsc2UoWDY1MD09IiIsTkEsYXMuY2hhcmFjdGVyKFg2NTApKSwNCiAgICAgICAgIFg2NTUgPSBpZmVsc2UoWDY1NT09IiIsTkEsYXMuY2hhcmFjdGVyKFg2NTUpKSwNCiAgICAgICAgIGpvaW50ID0gcGFzdGUoWDY1MCxYNjU1LHNlcCA9ICJ+IikpICU+JQ0KICBsZWZ0X2pvaW4oLixkb19pbXBvcnR1X05JRSxieSA9ICJqb2ludCIpICU+JQ0KICBtdXRhdGUoWDY1MCA9IGlmZWxzZShpcy5uYShYNjUwKSwiIixhcy5jaGFyYWN0ZXIoWDY1MCkpLA0KICAgICAgICAgWDY1NSA9IGlmZWxzZShpcy5uYShYNjU1KSwiIixhcy5jaGFyYWN0ZXIoWDY1NSkpKQ0KDQpkb19pbXBvcnR1X05JRSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKGlzLm5hKG9zb2JhX2JuX2F1dG9yKSZpcy5uYShvc29iYV9ibl90ZW1hdCkmaXMubmEoc2xvd2FfbGl0ZXJhY2tpZSkmZG9fd3lyenVjZW5pYV9uYV9wb2RzdGF3aWVfSU5PPT0idGFrIikgJT4lDQogIGZpbHRlcighZ3JlcGwoImxpdGVyYXR8bGl0ZXJhY3xwYW1pxJl0bmlrfHBpc2FyIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSkpDQoNCmJuX29rIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgZnJvbSBibl9vayBhDQogICAgICAgICAgICAgICB3aGVyZSBhLmlkIG5vdCBpbiAoc2VsZWN0IGIuaWQgZnJvbSBkb19pbXBvcnR1X05JRSBiKSIpICU+JQ0KICBzZWxlY3QoLWpvaW50LC1kb193eXJ6dWNlbmlhX25hX3BvZHN0YXdpZV9JTk8pDQoNCiN1c3VuacSZY2llIG5hIHBvZHN0YXdpZSB0YWJlbCBLUA0Kb3V0IDwtIHNoZWV0c19yZWFkKHNzID0gIjFsT19adHd5QkRlUEdxWGtnV3lrX1dtR2VRQmFBUUJ2RVVqTm5jdHJ3LXZnIikgJT4lDQogIGZpbHRlcih3Y2hvZHppX2RvX3BibCA9PSAibmllIikNCg0KS1Bfb3V0IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIld5ZGF3bmljdHdhIHBvcHVsYXJuZSIsWDY1NSkpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgZnVsbF9qb2luKC4sb3V0LGJ5ID0gIlg2NTAiKSAlPiUNCiAgZmlsdGVyKHdjaG9kemlfZG9fcGJsPT0ibmllIikgJT4lDQogIGZpbHRlcighaXMubmEoWDY1NSkpICU+JQ0KICBzZWxlY3QoaWQpDQoNCmJuX29rIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgZnJvbSBibl9vayBhDQogICAgICAgICAgICAgICB3aGVyZSBhLmlkIG5vdCBpbiAoc2VsZWN0IGIuaWQgZnJvbSBLUF9vdXQgYikiKQ0KDQojY3p5IHByw7Nib3dhxIcgd3lyenVjYcSHIHBvIFVLRCwga3TDs3JlIGRvc3Rhd2HFgm8gdHlsa28gSU5PPw0KI2FrdHVhbGl6YWNqYSAtIGRvZGFqIGRvIHNrcnlwdHUgbGlzdMSZIHogb3N0YXRuaW0gYnJha3VqxIVjeW0gemFpbXBvcnRvd2FueW0gcm9jem5pa2llbQ0KZG9faW1wb3J0dV9OSUUyIDwtIHJiaW5kKGxpc3R5XzIwMDQsbGlzdHlfMjAwNSxsaXN0eV8yMDA2LGxpc3R5XzIwMDcsbGlzdHlfMjAwOCwgbGlzdHlfMjAwOSwgbGlzdHlfMjAxMCwgbGlzdHlfMjAxMSkgJT4lDQogIGZ1bGxfam9pbiguLHphcGlzeSxieSA9ICJaQV9aQVBJU19JRCIpICU+JQ0KICBzZWxlY3QoWDA4MCxaQV9TVEFUVVNfSU1QKSAlPiUNCiAgbXV0YXRlKFgwODAgPSBzdHJfcmVtb3ZlX2FsbChYMDgwLCJcXFxcIikpICU+JQ0KICBzZWxlY3QoWkFfU1RBVFVTX0lNUCxYMDgwKSAlPiUNCiAgZ3JvdXBfYnkoWDA4MCkgJT4lDQogIG11dGF0ZShncnVwYSA9IHBhc3RlKFpBX1NUQVRVU19JTVAsY29sbGFwc2UgPSAiLCIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICBzZWxlY3QoWDA4MCwgZ3J1cGEpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKGlsZSA9IHN0cl9jb3VudChncnVwYSwiLCIpKzEpICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIklOTyIsZ3J1cGEpKSAlPiUNCiAgZmlsdGVyKCFncmVwbCgiSU9LfElNUHxJUE58SVBDIixncnVwYSkpICU+JQ0KI3R1IHNpxJkgbXVzaSBLUCB3eXBvd2llZHppZcSHLCBjenkgamFrIGJ5xYJvIDJ4TklFIHRvIHd5c3RhcmN6eSwgxbxlYnkgd3l3YWxhxIcNCiMgIGZpbHRlcihpbGUgPiAxKSAlPiUNCiAgc2VsZWN0KFgwODApICU+JQ0KICBtdXRhdGUoWDA4MCA9IHBhc3RlKCJcXCIsc3RyX3JlbW92ZV9hbGwoc3RyX3JlcGxhY2VfYWxsKFgwODAsIihcXCRhKSIsIlxcXFwjXFwxIiksIiMiKSxzZXAgPSAiIikpICU+JQ0KICBtdXRhdGUoZG9fd3lyenVjZW5pYV9uYV9wb2RzdGF3aWVfSU5PID0gInRhayIpDQoNCiNuYSBwb2RzdGF3aWUgVUtEIHRlxbwgd3lyenVjacSHIC0gZGVjeXpqYSBLUA0KYm5fb2sgPC0gYm5fb2sgJT4lDQogIGZ1bGxfam9pbiguLGRvX2ltcG9ydHVfTklFMixieSA9ICJYMDgwIikgJT4lDQogIGZpbHRlcighaXMubmEoaWQpKQ0KDQpkb19pbXBvcnR1X05JRTIgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihpcy5uYShvc29iYV9ibl9hdXRvcikmaXMubmEob3NvYmFfYm5fdGVtYXQpJmlzLm5hKHNsb3dhX2xpdGVyYWNraWUpJmRvX3d5cnp1Y2VuaWFfbmFfcG9kc3Rhd2llX0lOTz09InRhayIpDQoNCmJuX29rIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgZnJvbSBibl9vayBhDQogICAgICAgICAgICAgICB3aGVyZSBhLmlkIG5vdCBpbiAoc2VsZWN0IGIuaWQgZnJvbSBkb19pbXBvcnR1X05JRTIgYikiKSAlPiUNCiAgc2VsZWN0KC1kb193eXJ6dWNlbmlhX25hX3BvZHN0YXdpZV9JTk8pDQoNCiNyZXN6dGEgcmVrb3Jkw7N3LCBrdMOzcmUgbmllIGLEmWTEhSB6YWltcG9ydG93YW5lDQpyZXN6dGEgPC0gc3FsZGYoInNlbGVjdCAqDQogICAgICAgICAgICAgICBmcm9tIGJuX2tzIGENCiAgICAgICAgICAgICAgIHdoZXJlIGEuaWQgbm90IGluIA0KICAgICAgICAgICAgICAgKHNlbGVjdCBiLmlkDQogICAgICAgICAgICAgICBmcm9tIGJuX29rIGIpIikNCmNodW5rNCA8LSBibl9vaw0KYGBgDQoNCmBgYHtyIHByenlwaXNhbmllIGtzacSFxbxjZSByb2R6YWp1IChwb2RtaW90b3dhLCBwcnplZG1pb3Rvd2EsIGFudG9sb2dpZSwgd3Nww7PFgnd5ZGFuaWUpfQ0KYm5fb2sgPC0gY2h1bms0DQpzdGFyZV9yb2R6YWpvd2FuaWUgPC0gYm5fb2sgJT4lDQogIG11dGF0ZShjenlfbWFfdWtkID0gaWZlbHNlKFgwODA9PSIiLCJuaWUiLCJ0YWsiKSwNCiAgICAgICAgIHBvc2l0aW9uX2Rhc2ggPSBpZmVsc2UoZ3JlcGwoIihcXFxcXFxcXFxcJGF8OikoODIxXFwuKSIsWDA4MCksc3RyX2xvY2F0ZShYMDgwLCJcXC0iKVssMV0sIE5BKSwNCiAgICAgICAgIHBvc2l0aW9uX2Rhc2ggPSBpZmVsc2UoaXMubmEocG9zaXRpb25fZGFzaCksIiIsYXMuaW50ZWdlcihwb3NpdGlvbl9kYXNoKSksDQogICAgICAgICBwb3NpdGlvbl8wOTEgPSBzdHJfbG9jYXRlKFgwODAsIlxcKDA5MVxcKSIpWywxXSwNCiAgICAgICAgIHBvc2l0aW9uXzA5MSA9IGlmZWxzZShpcy5uYShwb3NpdGlvbl8wOTEpLCIiLGFzLmludGVnZXIocG9zaXRpb25fMDkxKSksDQogICAgICAgICByb2R6YWpfa3NpYXpraSA9IGlmZWxzZShncmVwbCgiQW50b2xvZ2kiLFg2NTUpLCJhbnRvbG9naWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHBvc2l0aW9uXzA5MSE9IiImcG9zaXRpb25fZGFzaCE9IiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShhcy5pbnRlZ2VyKHBvc2l0aW9uXzA5MSk8YXMuaW50ZWdlcihwb3NpdGlvbl9kYXNoKSwgInByemVkbWlvdG93YSIsICJwb2RtaW90b3dhIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwb3NpdGlvbl9kYXNoIT0iIiwicG9kbWlvdG93YSIsInByemVkbWlvdG93YSIpKSksDQogICAgICAgICByb2R6YWpfa3NpYXpraSA9IGlmZWxzZShjenlfbWFfdWtkPT0ibmllIiwiIixhcy5jaGFyYWN0ZXIocm9kemFqX2tzaWF6a2kpKSkNCmdhdHVua2lfcG9kbWlvdG93ZSA8LSBzdGFyZV9yb2R6YWpvd2FuaWUgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09InBvZG1pb3Rvd2EiKSAlPiUNCiAgc2VsZWN0KFg2NTUpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgY1NwbGl0KC4sIlg2NTUiLHNlcCA9ICJ8IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QoWDY1NSwiXFwkeVtcXGQtXSsgd1xcLiIpKQ0KZ2F0dW5raV9wb2RtaW90b3dlIDwtIHN0cl9yZXBsYWNlX2FsbChzdHJfcmVwbGFjZV9hbGwocGFzdGUoZ2F0dW5raV9wb2RtaW90b3dlJFg2NTUsY29sbGFwc2UgPSAifCIpLCIoLnsyfSkoXFwkYSkiLCJcXDIiKSwiXFwkIiwiXFxcXCQiKQ0Kc3RhcmVfcm9kemFqb3dhbmllJGN6eV9wb2RtaW90b3d5IDwtIGdyZXBsKGdhdHVua2lfcG9kbWlvdG93ZSxzdGFyZV9yb2R6YWpvd2FuaWUkWDY1NSl8Z3JlcGwoZ2F0dW5raV9wb2RtaW90b3dlLHN0YXJlX3JvZHpham93YW5pZSRYNjUwKQ0Kc3RhcmVfcm9kemFqb3dhbmllIDwtIHN0YXJlX3JvZHpham93YW5pZSAlPiUNCiAgbXV0YXRlKHJvZHphal9rc2lhemtpID0gaWZlbHNlKHN0cl9jb3VudChYMjQ1LCAiIC8gIikrMT4yLCJhbnRvbG9naWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN0cl9jb3VudChYMjQ1LCAiIC8gIikrMT09Miwid3Nww7PFgnd5ZGFuaWUiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShyb2R6YWpfa3NpYXpraT09IiImY3p5X3BvZG1pb3Rvd3k9PVRSVUUmIWdyZXBsKCJ4aGlzdG9yaWF8eHRlbWF0eWthfHhiaW9ncmFmaWEiLFg2NTApJiFncmVwbCgieGhpc3RvcmlhfHh0ZW1hdHlrYXx4YmlvZ3JhZmlhIixYNjU1KSwicG9kbWlvdG93YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShYMTAwIT0iIiZncmVwbCgiYVBhbWnEmXRuaWt8YUxpdGVyYXR1cmEgcG9kcsOzxbxuaWN6YSIsWDY1NSkmIWdyZXBsKCJ4aGlzdG9yaWF8eHRlbWF0eWthfHhiaW9ncmFmaWEiLFg2NTApJiFncmVwbCgieGhpc3RvcmlhfHh0ZW1hdHlrYXx4YmlvZ3JhZmlhIixYNjU1KSwicG9kbWlvdG93YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoWDEwMCE9IiImZ3JlcGwoImFSZXBvcnRhxbwiLFg2NTUpJmdyZXBsKCJcXCR5IixYNjU1KSYhZ3JlcGwoInhoaXN0b3JpYXx4dGVtYXR5a2F8eGJpb2dyYWZpYSIsWDY1MCkmIWdyZXBsKCJ4aGlzdG9yaWF8eHRlbWF0eWthfHhiaW9ncmFmaWEiLFg2NTUpLCJwb2RtaW90b3dhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoWDEwMCE9IiImKFg2NTU9PSJcXDckYVJlcG9ydGHFvCBwb2xza2kkMkRCTiJ8WDY1NT09IlxcNyRhUmVwb3J0YcW8JDJEQk4iKSYhZ3JlcGwoInhoaXN0b3JpYXx4dGVtYXR5a2F8eGJpb2dyYWZpYSIsWDY1MCkmIWdyZXBsKCJ4aGlzdG9yaWF8eHRlbWF0eWthfHhiaW9ncmFmaWEiLFg2NTUpLCJwb2RtaW90b3dhIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHJvZHphal9rc2lhemtpPT0iIiZjenlfcG9kbWlvdG93eT09RkFMU0UsInByemVkbWlvdG93YSIsYXMuY2hhcmFjdGVyKHJvZHphal9rc2lhemtpKSkpKSkpKSksDQogICAgICAgICByb2R6YWpfa3NpYXpraSA9IGlmZWxzZShyb2R6YWpfa3NpYXpraT09IiIsInByemVkbWlvdG93YSIsYXMuY2hhcmFjdGVyKHJvZHphal9rc2lhemtpKSksDQogICAgICAgICByb2R6YWpfa3NpYXpraSA9IGlmZWxzZShncmVwbCgiTGVrdHVyeSBXc3plY2ggQ3phc8OzdyA6IHN0cmVzemN6ZW5pZSwgYW5hbGl6YSwgaW50ZXJwcmV0YWNqYXxMZWt0dXJ5IFdzemVjaCBDemFzw7N3IC0gTGl0ZXJhdHxCaWJsaW90ZWN6a2EgT3ByYWNvd2HFhCIsWDQ5MCl8Z3JlcGwoIkxla3R1cnkgV3N6ZWNoIEN6YXPDs3cgOiBzdHJlc3pjemVuaWUsIGFuYWxpemEsIGludGVycHJldGFjamF8TGVrdHVyeSBXc3plY2ggQ3phc8OzdyAtIExpdGVyYXR8QmlibGlvdGVjemthIE9wcmFjb3dhxYQiLFg4MzApLCJwcnplZG1pb3Rvd2EiLGFzLmNoYXJhY3Rlcihyb2R6YWpfa3NpYXpraSkpLA0KICAgICAgICAgaWx1X3R3b3Jjb3cgPSBzdHJfY291bnQoWDEwMCwiXFwkYSIpLA0KICAgICAgICAgcm9kemFqX2tzaWF6a2kgPSBpZmVsc2UoaWx1X3R3b3Jjb3c+NCZyb2R6YWpfa3NpYXpraT09InBvZG1pb3Rvd2EiLCJhbnRvbG9naWEiLGFzLmNoYXJhY3Rlcihyb2R6YWpfa3NpYXpraSkpLA0KICAgICAgICAgcm9kemFqX2tzaWF6a2kgPSBpZmVsc2UoZ3JlcGwoIkxlZ2VuZHkiLFg2NTUpLCJhbnRvbG9naWEiLGFzLmNoYXJhY3Rlcihyb2R6YWpfa3NpYXpraSkpKSAlPiUNCiAgZmlsdGVyKGdyZXBsKCJrYXRhbG9nIHd5c3Rhd3kiLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKSZyb2R6YWpfa3NpYXpraT09InByemVkbWlvdG93YSIpICU+JSANCiAgc2VsZWN0KGlkKQ0KDQojI3fFgmHFm2Npd2Ugcm9kemFqb3dhbmllIHogdXdhZ2zEmWRuaWVuaWVtIGplZG5lZ28gZWxlbWVudHUgemUgc3RhcmVnbyByb2R6YWpvd2FuaWENCmJuX29rIDwtIGJuX29rICU+JQ0KICBtdXRhdGUoY3p5X21hX3VrZCA9IGlmZWxzZShYMDgwPT0iIiwibmllIiwidGFrIiksDQogICAgICAgICBwb3NpdGlvbl9kYXNoID0gaWZlbHNlKGdyZXBsKCIoXFxcXFxcXFxcXCRhfDopKDgyMVxcLikiLFgwODApLHN0cl9sb2NhdGUoc3RyX3JlcGxhY2UoWDA4MCwiKC4qPykoXFwkYTgyMVxcLikoLio/JCkiLCJcXDJcXDMiKSwiXFwtIilbLDFdK25jaGFyKHN0cl9yZXBsYWNlKFgwODAsIiguKj8pKFxcJGE4MjFcXC4pKC4qPyQpIiwiXFwxIikpLCBOQSksDQogICAgICAgICBwb3NpdGlvbl9kYXNoID0gaWZlbHNlKGlzLm5hKHBvc2l0aW9uX2Rhc2gpLCIiLGFzLmludGVnZXIocG9zaXRpb25fZGFzaCkpLA0KICAgICAgICAgcG9zaXRpb25fMDkxID0gc3RyX2xvY2F0ZShYMDgwLCJcXCgwOTFcXCkiKVssMV0sDQogICAgICAgICBwb3NpdGlvbl8wOTEgPSBpZmVsc2UoaXMubmEocG9zaXRpb25fMDkxKSwiIixhcy5pbnRlZ2VyKHBvc2l0aW9uXzA5MSkpLA0KICAgICAgICAgcm9kemFqX2tzaWF6a2kgPSBpZmVsc2UoZ3JlcGwoImFudG9sb2dpfFByenlzxYJvd2lhIFtcXFNdK1xcJDJ8Q3l0YXR5XFwkMiIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpLCJhbnRvbG9naWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHBvc2l0aW9uXzA5MSE9IiImcG9zaXRpb25fZGFzaCE9IiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShhcy5pbnRlZ2VyKHBvc2l0aW9uXzA5MSk8YXMuaW50ZWdlcihwb3NpdGlvbl9kYXNoKSwgInByemVkbWlvdG93YSIsICJwb2RtaW90b3dhIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwb3NpdGlvbl9kYXNoIT0iIiwicG9kbWlvdG93YSIsInByemVkbWlvdG93YSIpKSksDQogICAgICAgICByb2R6YWpfa3NpYXpraSA9IGlmZWxzZShjenlfbWFfdWtkPT0ibmllIiwiIixhcy5jaGFyYWN0ZXIocm9kemFqX2tzaWF6a2kpKSwNCiAgICAgICAgIHJvZHphal9rc2lhemtpID0gaWZlbHNlKGdyZXBsKCI4Mi05MyIsWDA4MCkmcm9kemFqX2tzaWF6a2khPSJhbnRvbG9naWEiLCJwb2RtaW90b3dhIixhcy5jaGFyYWN0ZXIocm9kemFqX2tzaWF6a2kpKSkNCg0KcmVrb3JkeV9wb2RtaW90b3dlX3N0YXJlIDwtIGRiR2V0UXVlcnkoUEJMLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCB6LnphX3phcGlzX2lkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBwYmxfemFwaXN5IHoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luIElCTF9PV05FUi5wYmxfcm9kemFqZV96YXBpc293IHJ6IG9uIHJ6LnJ6X3JvZHphal9pZD16LnphX3J6X3JvZHphajFfaWQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSByei5yel9yb2R6YWpfaWQ9MQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB6LnphX3V3YWdpIGxpa2UgJyVpbXBvcnQlJyIpDQojYWt0dWFsaXphY2phIC0gZG9kYWogZG8gc2tyeXB0dSBsaXN0xJkgeiBvc3RhdG5pbSBicmFrdWrEhWN5bSB6YWltcG9ydG93YW55bSByb2N6bmlraWVtDQpnYXR1bmtpX3BvcHJ6ZWRuaWVfaW1wIDwtIHJiaW5kKGxpc3R5XzIwMDQsbGlzdHlfMjAwNSxsaXN0eV8yMDA2LGxpc3R5XzIwMDcsbGlzdHlfMjAwOCwgbGlzdHlfMjAwOSwgbGlzdHlfMjAxMCwgbGlzdHlfMjAxMSkgJT4lIA0KICBmaWx0ZXIoWkFfWkFQSVNfSUQgJWluJSByZWtvcmR5X3BvZG1pb3Rvd2Vfc3RhcmUkWkFfWkFQSVNfSUQpICU+JSANCiAgbXV0YXRlKFg2NTUgPSBpZmVsc2Uocm9rPT0yMDA0LHN0cl9yZW1vdmVfYWxsKHN0cl9yZXBsYWNlX2FsbChYNjU1LCIoXFwkYSkiLCJcXFxcIzdcXDEiKSwiIyIpLGFzLmNoYXJhY3RlcihYNjU1KSkpICU+JSANCiAgc2VsZWN0KFg2NTUpICU+JSANCiAgdW5pcXVlKCkNCg0KZ2F0dW5raV9wb2RtaW90b3dlIDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwb2RtaW90b3dhIikgJT4lDQogIHNlbGVjdChYNjU1KSAlPiUNCiAgYmluZF9yb3dzKC4sZ2F0dW5raV9wb3ByemVkbmllX2ltcCkgJT4lIA0KICB1bmlxdWUoKSAlPiUNCiAgY1NwbGl0KC4sIlg2NTUiLHNlcCA9ICJ8IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgZmlsdGVyKCFncmVwbCgieGhpc3RvcmlhfHh0ZW1hdHlrYXx4YmlvZ3JhZmlhIixYNjU1KSkgJT4lIA0KICBmaWx0ZXIoc3RyX2RldGVjdChYNjU1LCJcXCR5W1xcZC1dKyB3XFwuIiksIA0KICAgICAgICAgZ3JlcGwoIiggXFxTKykoXFwkeSkoLio/JCkiLCBYNjU1KSkgJT4lIA0KICAjbXV0YXRlKFg2NTUgPSBzdHJfcmVwbGFjZShYNjU1LCAiKD88PSApKFxcUyspKFxcJHkpKC4qPyQpIiwgIltcXFxcU10rXFwyIikpICU+JSANCiAgbXV0YXRlKFg2NTUgPSBzdHJfcmVwbGFjZShYNjU1LCAiKD88PSApKFxcUyspKFxcJHkpKC4qPyQpIiwgIi4rXFwyIikpICU+JSANCiAgdW5pcXVlKCkNCg0KZ2F0dW5raV9wb2RtaW90b3dlIDwtIHN0cl9yZXBsYWNlX2FsbChzdHJfcmVwbGFjZV9hbGwoc3RyX3JlcGxhY2VfYWxsKHBhc3RlKGdhdHVua2lfcG9kbWlvdG93ZSRYNjU1LGNvbGxhcHNlID0gInwiKSwiKC57Mn0pKFxcJGEpIiwiXFwyIiksIlxcJCIsIlxcXFwkIiksICJcXCgiLCAiXFxcXFxcKCIpDQpibl9vayRjenlfcG9kbWlvdG93eSA8LSBncmVwbChnYXR1bmtpX3BvZG1pb3Rvd2UsYm5fb2skWDY1NSl8Z3JlcGwoZ2F0dW5raV9wb2RtaW90b3dlLGJuX29rJFg2NTApDQpibl9vayA8LSBibl9vayAlPiUNCiAgbXV0YXRlKHJvZHphal9rc2lhemtpID0gaWZlbHNlKHN0cl9jb3VudChYMjQ1LCAiIFxcLyAiKSsxPjIsImFudG9sb2dpYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3RyX2NvdW50KFgyNDUsICIgXFwvIFxcW3swLDF9W0EtWkHDgcOAw4LDg8OExILEgMOFxITDhkXDicOIw4rDi8SaxJLElsSYScONw4zDjsOPxKrErklPw5PDksOUw5XDlsWQw5jFklXDmsOZw5vDnMWwxarFr1nDnUPEhsSMw6dExI7EkMSQR8SixJ5LxLZMxYHEu07Fg8ORxYfFhcWKUsWYU8WaxaDFnlPDn1TFpMWmw57FojhaxbvFucW9XSIpKzE9PTIsIndzcMOzxYJ3eWRhbmllIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uocm9kemFqX2tzaWF6a2k9PSIiJmN6eV9wb2RtaW90b3d5PT1UUlVFJiFncmVwbCgieGhpc3RvcmlhfHh0ZW1hdHlrYXx4YmlvZ3JhZmlhIixYNjUwKSYhZ3JlcGwoInhoaXN0b3JpYXx4dGVtYXR5a2F8eGJpb2dyYWZpYSIsWDY1NSksInBvZG1pb3Rvd2EiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoWDEwMCE9IiImZ3JlcGwoImFQYW1pxJl0bmlrfGFMaXRlcmF0dXJhIHBvZHLDs8W8bmljemEiLFg2NTUpJiFncmVwbCgieGhpc3RvcmlhfHh0ZW1hdHlrYXx4YmlvZ3JhZmlhIixYNjUwKSYhZ3JlcGwoInhoaXN0b3JpYXx4dGVtYXR5a2F8eGJpb2dyYWZpYSIsWDY1NSksInBvZG1pb3Rvd2EiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFgxMDAhPSIiJmdyZXBsKCJhUmVwb3J0YcW8IixYNjU1KSZncmVwbCgiXFwkeSIsWDY1NSkmIWdyZXBsKCJ4aGlzdG9yaWF8eHRlbWF0eWthfHhiaW9ncmFmaWEiLFg2NTApJiFncmVwbCgieGhpc3RvcmlhfHh0ZW1hdHlrYXx4YmlvZ3JhZmlhIixYNjU1KSwicG9kbWlvdG93YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFgxMDAhPSIiJihYNjU1PT0iXFw3JGFSZXBvcnRhxbwgcG9sc2tpJDJEQk4ifFg2NTU9PSJcXDckYVJlcG9ydGHFvCQyREJOIikmIWdyZXBsKCJ4aGlzdG9yaWF8eHRlbWF0eWthfHhiaW9ncmFmaWEiLFg2NTApJiFncmVwbCgieGhpc3RvcmlhfHh0ZW1hdHlrYXx4YmlvZ3JhZmlhIixYNjU1KSwicG9kbWlvdG93YSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShyb2R6YWpfa3NpYXpraT09IiImY3p5X3BvZG1pb3Rvd3k9PUZBTFNFLCJwcnplZG1pb3Rvd2EiLGFzLmNoYXJhY3Rlcihyb2R6YWpfa3NpYXpraSkpKSkpKSkpLA0KICAgICAgICAgcm9kemFqX2tzaWF6a2kgPSBpZmVsc2Uocm9kemFqX2tzaWF6a2k9PSIiLCJwcnplZG1pb3Rvd2EiLGFzLmNoYXJhY3Rlcihyb2R6YWpfa3NpYXpraSkpLA0KICAgICAgICAgcm9kemFqX2tzaWF6a2kgPSBpZmVsc2UoZ3JlcGwoIkxla3R1cnkgV3N6ZWNoIEN6YXPDs3cgXFw6IHN0cmVzemN6ZW5pZSwgYW5hbGl6YSwgaW50ZXJwcmV0YWNqYXxMZWt0dXJ5IFdzemVjaCBDemFzw7N3IC0gTGl0ZXJhdHxCaWJsaW90ZWN6a2EgT3ByYWNvd2HFhCIsWDQ5MCl8Z3JlcGwoIkxla3R1cnkgV3N6ZWNoIEN6YXPDs3cgXFw6IHN0cmVzemN6ZW5pZSwgYW5hbGl6YSwgaW50ZXJwcmV0YWNqYXxMZWt0dXJ5IFdzemVjaCBDemFzw7N3IC0gTGl0ZXJhdHxCaWJsaW90ZWN6a2EgT3ByYWNvd2HFhCIsWDgzMCksInByemVkbWlvdG93YSIsYXMuY2hhcmFjdGVyKHJvZHphal9rc2lhemtpKSksDQogICAgICAgICByb2R6YWpfa3NpYXpraSA9IGlmZWxzZShncmVwbCgiYUxla3R1cmEgeiBPcHJhY293YW5pZW0gLSBaaWVsb25hIFNvd2F8YUxla3R1cmEgXFwoR3JlZ1xcKXxhTGVrdHVyYSBEb2JyemUgT3ByYWNvd2FuYXxhTGVrdHVyYSB6IE9wcmFjb3dhbmllbSAtIEliaXMiLFg4MzApLCJwb2RtaW90b3dhIixhcy5jaGFyYWN0ZXIocm9kemFqX2tzaWF6a2kpKSwNCiAgICAgICAgIGlsdV90d29yY293ID0gc3RyX2NvdW50KFgxMDAsIlxcJGEiKSwNCiAgICAgICAgIHJvZHphal9rc2lhemtpID0gaWZlbHNlKGlsdV90d29yY293PjQmcm9kemFqX2tzaWF6a2k9PSJwb2RtaW90b3dhIiwiYW50b2xvZ2lhIixhcy5jaGFyYWN0ZXIocm9kemFqX2tzaWF6a2kpKSwNCiAgICAgICAgIHJvZHphal9rc2lhemtpID0gaWZlbHNlKGdyZXBsKCJMZWdlbmR5fFxcJHZhbnRvbG9naSIsWDY1NSksImFudG9sb2dpYSIsYXMuY2hhcmFjdGVyKHJvZHphal9rc2lhemtpKSksDQogICAgICAgICByb2R6YWpfa3NpYXpraSA9IGlmZWxzZShzdHJfY291bnQoWDEwMCwgIlxcfCIpPT0wJlgxMDAhPSIiJnJvZHphal9rc2lhemtpPT0iYW50b2xvZ2lhIiZncmVwbCgiTGVnZW5keSBpIHBvZGFuaWF8QW50b2xvZ2lhIixYNjU1KSwicG9kbWlvdG93YSIsYXMuY2hhcmFjdGVyKHJvZHphal9rc2lhemtpKSksDQogICAgICAgICByb2R6YWpfa3NpYXpraSA9IGlmZWxzZShYMTAwPT0iIiZzdHJfY291bnQoWDcwMCwiXFwkdCIpPT0zJmdyZXBsKCJIYXJsZXF1aW4iLFgyNjApLCJhbnRvbG9naWEiLGFzLmNoYXJhY3Rlcihyb2R6YWpfa3NpYXpraSkpKSAlPiUNCiAgc2VsZWN0KDE6MzQscm9kemFqX2tzaWF6a2kpDQoNCg0KIyBwcnp5cGlzYW5pYSBkbyBwb2RtaW90b3dlaiBuYSBwb2RzdGF3aWUgc21pZXJjaSBwcnplZCAxNzAwDQptYXJjX2ZpZWxkXzEwMCA8LSBibl9vayAlPiUNCiAgZmlsdGVyKCFpcy5uYShvc29iYV9ibl9hdXRvcikpICU+JQ0KICBzZWxlY3QoaWQsWDEwMCklPiUNCiAgZmlsdGVyKCFncmVwbCgiXFx8IiwgWDEwMCkpICU+JSANCiAgZmlsdGVyKFgxMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgxMDA9c3RyX3JlcGxhY2VfYWxsKFgxMDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDEwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMTAwIT0iIikgJT4lDQogIG11dGF0ZShYMTAwPXN0cl9yZW1vdmVfYWxsKFgxMDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDEwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChibl9vayRYMTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzEwMDwtY2JpbmQobWFyY19maWVsZF8xMDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8xMDAkWDEwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzEwMCRYMTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzEwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzEwMCRYMTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8xMDAkWDEwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzEwMCA8LSBtYXJjX2ZpZWxkXzEwMCAlPiUgDQogIGZpbHRlcighaXMubmEoYCRkYCkgJiBzdHJfZXh0cmFjdChgJGRgLCAiXFxkKyg/IS4qXFxkKykiKSA8IDE3MDApDQoNCmJuX29rIDwtIGJuX29rICU+JSANCiAgbXV0YXRlKHJvZHphal9rc2lhemtpID0gaWZlbHNlKGlkICVpbiUgbWFyY19maWVsZF8xMDAkaWQsICJwb2RtaW90b3dhIiwgYXMuY2hhcmFjdGVyKHJvZHphal9rc2lhemtpKSksDQogICAgICAgICByb2R6YWpfa3NpYXpraSA9IGlmZWxzZShpZCAlaW4lIHN0YXJlX3JvZHpham93YW5pZSRpZCwgInByemVkbWlvdG93YSIsYXMuY2hhcmFjdGVyKHJvZHphal9rc2lhemtpKSksDQogICAgICAgICByb2R6YWpfa3NpYXpraSA9IGlmZWxzZShYMDgwPT0iXFxcXCRhODItMS8tOSgwLjA1NCkiJnJvZHphal9rc2lhemtpPT0icHJ6ZWRtaW90b3dhIiYhZ3JlcGwoInhoaXN0b3JpYXx4dGVtYXR5a2F8eGJpb2dyYWZpYSIsWDY1MCkmIWdyZXBsKCJ4aGlzdG9yaWF8eHRlbWF0eWthfHhiaW9ncmFmaWEiLFg2NTUpLCJwb2RtaW90b3dhIixhcy5jaGFyYWN0ZXIocm9kemFqX2tzaWF6a2kpKSwNCiAgICAgICAgIHJvZHphal9rc2lhemtpID0gaWZlbHNlKHJvZHphal9rc2lhemtpPT0icG9kbWlvdG93YSImZ3JlcGwoImF1dFxcLiIsWDI0NSkmZ3JlcGwoImV0IGFsXFwuIixYMjQ1KSwiYW50b2xvZ2lhIixhcy5jaGFyYWN0ZXIocm9kemFqX2tzaWF6a2kpKSkNCmNodW5rNSA8LSBibl9vaw0KYGBgDQoNCmBgYHtyIHd5em5hY3plbmllIHpiaW9ydSBhdXRvbWF0eWN6bmllIElPS30NCmJuX29rIDwtIGNodW5rNQ0KSU9LX3BvZG0gPC0gYm5fb2sgJT4lDQogIGZpbHRlcighZ3JlcGwoIlxcJHQiLFg3MDApKSAlPiUNCiAgbXV0YXRlKGlsZV9nYXR1bmtvdyA9IGlmZWxzZShyb2R6YWpfa3NpYXpraT09InBvZG1pb3Rvd2EiLHN0cl9jb3VudChYNjU1LCJcXCRhIiksIm5pZSIpLA0KICAgICAgICAgdHlsa29fcG9kbWlvdG93ZSA9IGlmZWxzZShzdHJfY291bnQoWDY1NSwiXFwkYSIpPjAmc3RyX2NvdW50KFg2NTUsIlxcJGEiKT09c3RyX2NvdW50KFg2NTUsIlxcJHkiKSZzdHJfY291bnQoWDY1NSwiXFwkeSIpIT1zdHJfY291bnQoWDY1NSwiXFwkeCIpLCJ0YWsiLCJuaWUiKSkgJT4lDQogIGZpbHRlcihzdHJfY291bnQoWDEwMCwiXFwkYSIpPT0xKSAlPiUNCiAgZmlsdGVyKCFncmVwbCgicHNldWR8bmF6d2EiLFg1MDAsaWdub3JlLmNhc2UgPSBUUlVFKSZYNTAxPT0iIiYodHlsa29fcG9kbWlvdG93ZT09InRhayJ8aWxlX2dhdHVua293PT0iMSIpJlgxMDAhPSIiKQ0KDQojemVzdGF3aWVuaWUgMTAwIGkgMjQ1DQojMTAwDQptYXJjX2ZpZWxkXzEwMCA8LSBJT0tfcG9kbSAlPiUNCiAgc2VsZWN0KGlkLFgxMDApJT4lDQogIGZpbHRlcihYMTAwIT0iIikgJT4lDQogIG11dGF0ZShYMTAwPXN0cl9yZXBsYWNlX2FsbChYMTAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgxMDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDEwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDEwMD1zdHJfcmVtb3ZlX2FsbChYMTAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgxMDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoSU9LX3BvZG0kWDEwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzEwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8xMDA8LWNiaW5kKG1hcmNfZmllbGRfMTAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMTAwJFgxMDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8xMDAkWDEwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8xMDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8xMDAkWDEwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMTAwJFgxMDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfMTAwIDwtIG1hcmNfZmllbGRfMTAwICU+JQ0KICBzZWxlY3QoaWQsYCRhYCkgJT4lDQogIG11dGF0ZShibl9uYXp3aXNrbyA9IGlmZWxzZShzdHJfZGV0ZWN0KGAkYWAsIiwiKSxzdHJfcmVwbGFjZShgJGFgLCJeKC4qPykoLCApKC4qPyQpIiwiXFwxIiksYXMuY2hhcmFjdGVyKGAkYWApKSwNCiAgICAgICAgIGJuX2ltaWUgPSBpZmVsc2Uoc3RyX2RldGVjdChgJGFgLCIsIiksc3RyX3JlcGxhY2UoYCRhYCwiXiguKj8pKCwgKSguKj8kKSIsIlxcMyIpLCIiKSkgJT4lDQogIHNlbGVjdChpZCxibl9uYXp3aXNrbyxibl9pbWllKQ0KDQpJT0tfcG9kbSA8LSBJT0tfcG9kbSAlPiUNCiAgZnVsbF9qb2luKC4sbWFyY19maWVsZF8xMDAsYnkgPSAiaWQiKQ0KDQp4IDwtIDE6bGVuZ3RoKElPS19wb2RtJGlkKQ0KZm9yIChpIGluIHgpIHsNCiAgDQogIElPS19wb2RtJGN6eV9uYXp3aXNrb1tpXSA8LSBncmVwbChJT0tfcG9kbSRibl9uYXp3aXNrb1tpXSxJT0tfcG9kbSRYMjQ1W2ldKQ0KICBJT0tfcG9kbSRjenlfaW1pZVtpXSA8LSBncmVwbChJT0tfcG9kbSRibl9pbWllW2ldLElPS19wb2RtJFgyNDVbaV0pDQogIA0KfQ0KI3VzdW5pxJljaWUgdHljaCwga3TDs3JlIG5pZSBtYWrEhSB0eXR1xYLDs3cgb3J5Z2luYWxueWNoDQpJT0tfcG9kbSA8LSBJT0tfcG9kbSAlPiUNCiAgZmlsdGVyKGN6eV9uYXp3aXNrbz09MSZjenlfaW1pZT09MSYhZ3JlcGwoImV0IGFsXFwuIixYMjQ1KSkgJT4lDQogIHNlbGVjdCgtYm5fbmF6d2lza28sLWJuX2ltaWUsLWN6eV9uYXp3aXNrbywtY3p5X2ltaWUpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKGplenlrID0gc3RyX2V4dHJhY3QoWDA0MSwoIig/PD1cXCRoKSguLi4pIikpKSAlPiUNCiAgbXV0YXRlKGN6eV90eXR1bF9vYmN5ID0gaWZlbHNlKGlzLm5hKGplenlrKSwibmllIGRvdHljenkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKCFncmVwbCgicG9sIixqZXp5ayksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFgyNDYhPSIiLCJvayIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiVHl0WyxcXC5dIG9yeWciLFg1MDEpfGdyZXBsKCJUeXRbLFxcLl0gb3J5ZyIsWDUwMCksIm9rIiwicHJvYmxlbSIpKSwibmllIGRvdHljenkiKSkpICU+JQ0KICBmaWx0ZXIoY3p5X3R5dHVsX29iY3khPSJwcm9ibGVtIikgJT4lDQogIHNlbGVjdChpZCkgJT4lDQogIG11dGF0ZShhdXRvbWF0eWN6bmFfcG9kbWlvdG93YSA9ICJ0YWsiKQ0KIyMjdHV0YWoga2/FhGN6xIUgc2nEmSBhdXRvbWF0eWN6bmUgcG9kbWlvdG93ZQ0KYm5fb2sgPC0gYm5fb2sgJT4lDQogIGZ1bGxfam9pbiguLElPS19wb2RtLGJ5ID0gImlkIikgJT4lDQogIG11dGF0ZShjenlfYXV0b21hdHljem5pZSA9IGlmZWxzZSghaXMubmEoYXV0b21hdHljem5hX3BvZG1pb3Rvd2EpLCJwb2RtaW90b3dhIiwibmllIikpICU+JQ0KICBzZWxlY3QoLWF1dG9tYXR5Y3puYV9wb2RtaW90b3dhKSAlPiUNCiAgbXV0YXRlKGN6eV9hdXRvbWF0eWN6bmllID0gaWZlbHNlKGN6eV9hdXRvbWF0eWN6bmllPT0icG9kbWlvdG93YSImcm9kemFqX2tzaWF6a2khPSJwb2RtaW90b3dhIiwibmllIixhcy5jaGFyYWN0ZXIoY3p5X2F1dG9tYXR5Y3puaWUpKSkNCg0KIyMjY3p5IGkgamFrIGF1dG9tYXR5em93YcSHIHByemVkbWlvdG93xIU/DQoNCiN3cml0ZS5jc3YyKGJuX29rLCAiQzovVXNlcnMvQ2V6YXJ5L0Rlc2t0b3AvYm5fb2tfMjAwOS5jc3YiLCByb3cubmFtZXMgPSBGLCBuYSA9ICcnLCBmaWxlRW5jb2RpbmcgPSAnVVRGLTgnKQ0KY2h1bms2IDwtIGJuX29rDQpgYGANCg0KYGBge3Igd3l6bmFjemVuaWUgemJpb3J1IGRvIHV6dXBlxYJuaWVuaWEgdyBwcnp5c3rFgm/Fm2NpfQ0KYm5fb2sgPC0gY2h1bms2DQoNCiNwcm9wb3p5Y2phMQ0KI25hIHDDs8W6bmllaiBraWVyb3dhbmUgc8SFIHdzenlzdGtpZSBrc2nEhcW8a2kgcHJ6ZWRtaW90b3dlLCBrdMOzcmUgbWFqxIUgYmV6X3VrZF9QQkwgbHViIHVrZF9wb2dyYW5pY3plIGkgbmllIHPEhSBiaWJsacSFIG9yYXoga3NpxIXFvGtpIHd5ZGFuZSBwb3phIFBvbHNrxIUsIGt0w7NyZSBuaWUgcG9zesWCeSBkbyBhdXRvbWF0eWN6bmVnbyBpbXBvcnR1IG9yYXogaGFybGVxdWlueSwga3TDs3JlIG5pZSBwb3N6xYJ5IGRvIGF1dG9tYXR5Y3puZWdvIGltcG9ydHUNCm5hX3Bvem5pZWogPC0gYm5fb2sgJT4lDQogIGZpbHRlcigoaWYgKFg1MDE9PSIiKSAhZ3JlcGwoInBsIixzdWJzdHIoWDAwOCwxNiwxOCkpJiFncmVwbCgicG9sIixzdWJzdHIoWDAwOCwzNiwzOCkpJmN6eV9hdXRvbWF0eWN6bmllPT0ibmllIil8Y3p5X2F1dG9tYXR5Y3puaWU9PSJuaWUiJnJvZHphal9rc2lhemtpPT0icHJ6ZWRtaW90b3dhIiZkemllZHppbmFfUEJMICVpbiUgYygiYmV6X3VrZF9QQkwiLCJ1a2RfcG9ncmFuaWN6ZSIpJihjenlfYmlibGlhIT0idGFrInxpcy5uYShjenlfYmlibGlhKSl8Z3JlcGwoImFybGVxIixYMjYwLGlnbm9yZS5jYXNlID0gVFJVRSkmY3p5X2F1dG9tYXR5Y3puaWU9PSJuaWUiKQ0KDQojYmV6cGllY3puaWsNCg0KI3Byb3BvenljamEyDQojcHJvcG96eWNqYSwgYnkga2llcm93YcSHIG5hIHDDs8W6bmllaiB3c3p5c3RraWUga3NpxIXFvGtpIHByemVkbWlvdG93ZSB6IGR6aWVkemlueSAiYmV6X3VrZF9QQkwiDQojIG5hX3Bvem5pZWogPC0gYm5fb2sgJT4lDQojICAgZmlsdGVyKGN6eV9hdXRvbWF0eWN6bmllPT0ibmllIiZyb2R6YWpfa3NpYXpraT09InByemVkbWlvdG93YSImZHppZWR6aW5hX1BCTD09ImJlel91a2RfUEJMIiYoY3p5X2JpYmxpYSE9InRhayJ8aXMubmEoY3p5X2JpYmxpYSkpKQ0KDQojICNwcm9wb3p5Y2phMw0KIyBuYV9wb3puaWVqIDwtIGJuX29rICU+JQ0KIyAgIGZpbHRlcihjenlfYXV0b21hdHljem5pZT09Im5pZSImcm9kemFqX2tzaWF6a2k9PSJwcnplZG1pb3Rvd2EiJmR6aWVkemluYV9QQkwgJWluJSBjKCJiZXpfdWtkX1BCTCIsInVrZF9wb2dyYW5pY3plIikmKGN6eV9iaWJsaWEhPSJ0YWsifGlzLm5hKGN6eV9iaWJsaWEpKSkNCg0KI3Byb3BvenljamE0DQojc3RhcmEgb3BlcmFjamENCiMgbmFfcG96bmllaiA8LSBibl9vayAlPiUNCiMgICBmaWx0ZXIoY3p5X2F1dG9tYXR5Y3puaWU9PSJuaWUiJnJvZHphal9rc2lhemtpPT0icHJ6ZWRtaW90b3dhIiZkemllZHppbmFfUEJMPT0iYmV6X3VrZF9QQkwiKSAlPiUNCiMgICBtdXRhdGUoa2F0ZWdvcmllX2xpdGVyYWNraWUgPSBpZmVsc2UoZ3JlcGwoIm1pdG9sb2d8YmHFm3xiYWprfHBvZXpqfGxpcnlrfGVwaWt8ZHJhbWF0fGxpdGVyYWN8bGl0ZXJhdHxwaXNhcnx3aWVyc3p8cHJvenxwb3dpZcWbfG9wb3dpYWR8bWluaWF0dXJ8YWZvcnl6bXxlc2VqfHN6a2ljfGZlbGlldHxyZXBvcnR8ZHppZW5uaXx3c3BvbW5pZXxhdXRvYmlvZ3JhZnxrYXphfHJvem15xZtsfGxpc3R8aW50ZXJwcmV0YWNqIixYNjUwLGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoIm1pdG9sb2d8YmHFm3xiYWprfHBvZXpqfGxpcnlrfGVwaWt8ZHJhbWF0fGxpdGVyYWN8bGl0ZXJhdHxwaXNhcnx3aWVyc3p8cHJvenxwb3dpZcWbfG9wb3dpYWR8bWluaWF0dXJ8YWZvcnl6bXxlc2VqfHN6a2ljfGZlbGlldHxyZXBvcnR8ZHppZW5uaXx3c3BvbW5pZXxhdXRvYmlvZ3JhZnxrYXphfHJvem15xZtsfGxpc3R8aW50ZXJwcmV0YWNqIixYNjU1LCBpZ25vcmUuY2FzZSA9IFRSVUUpLCJ0YWsiLCJuaWUiKSkgJT4lDQojICAgZmlsdGVyKGthdGVnb3JpZV9saXRlcmFja2llPT0ibmllIikgJT4lDQojICAgbXV0YXRlKGxhdGEgPSBpZmVsc2UoZ3JlcGwoIlxcZHsyfS0iLFgxMDApLHN0cl9yZXBsYWNlKFgxMDAsIiguKlxcJGRcXCguKj8pKFxcZHsyLDR9KShcXD97MCwxfS0uKikiLCJcXDIiKSxOQSksDQojICAgICAgICAgIGxhdGFfdGVtYXQgPSBpZmVsc2UoZ3JlcGwoIlxcZHsyfS0iLFg2MDApLHN0cl9yZXBsYWNlKFg2MDAsIiguKlxcJGRcXCguKj8pKFxcZHsyLDR9KShcXD97MCwxfS0uKikiLCJcXDIiKSxOQSkpICU+JQ0KIyBmaWx0ZXIoKGlzLm5hKGxhdGEpJmlzLm5hKGxhdGFfdGVtYXQpKXwhKGFzLmludGVnZXIobGF0YSk8MTgwMCl8IShhcy5pbnRlZ2VyKGxhdGFfdGVtYXQpPDE4MDApKQ0Kd3JpdGUuY3N2MihuYV9wb3puaWVqLCBwYXN0ZSgiQzovVXNlcnMvIixlbXBsb3llZV9uYW1lLCIvRGVza3RvcC9ibl8iLGltcG9ydF95ZWFyLCJfa3NfbmFfcG96bmllai5jc3YiLHNlcCA9ICIiKSwgcm93Lm5hbWVzID0gRiwgbmEgPSAnJywgZmlsZUVuY29kaW5nID0gJ1VURi04JykNCg0KYm5fb2sgPC0gc3FsZGYoInNlbGVjdCAqDQogICAgICAgICAgICAgICBmcm9tIGJuX29rIGENCiAgICAgICAgICAgICAgIHdoZXJlIGEuaWQgbm90IGluIChzZWxlY3QgYi5pZCBmcm9tIG5hX3Bvem5pZWogYikiKQ0KY2h1bms3IDwtIGJuX29rDQpgYGANCg0KQ3p5IGplc3Qgc2VucyB0byByb2JpxIc/DQpgYGB7ciBhdXRvbWF0eWN6bmUgZHppYcWCb3dhbmllIHByemVkbWlvdG93ZWp9DQojIyNhdXRvbWF0eWN6bmllIGR6aWHFgm93YW5pZSBwcnplZG1pb3Rvd2VqIG5hIHBvZHN0YXdpZSBkb3R5Y2hjemFzb3d5Y2ggaW1wb3J0w7N3DQojemFwaXN5IDwtIFJKREJDOjpkYkdldFF1ZXJ5KFBCTCwNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCB6LnphX3phcGlzX2lkLCBkei5kel9kemlhbF9pZCwgZHouZHpfbmF6d2EsIHouemFfc3RhdHVzX2ltcCwgei56YV91d2FnaQ0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHBibF96YXBpc3kgeg0KIyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luIHBibF9kemlhbHkgZHogb24gZHouZHpfZHppYWxfaWQ9ei56YV9kel9kemlhbDFfaWQNCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgei56YV91d2FnaSBsaWtlICclaW1wb3J0JSciKSAlPiUNCiMgIG11dGF0ZShwcmFjb3duaWtfcGJsID0gc3RyX2V4dHJhY3QoWkFfVVdBR0ksICIoPzw9YWtjZXB0dWplOikoW0EtWl0qKSIpKSAlPiUNCiMgIHNlbGVjdCgtWkFfVVdBR0kpDQojDQojcG9wcnplZG5pZV9pbXBvcnR5IDwtIHJiaW5kKGxpc3R5XzIwMDQsbGlzdHlfMjAwNSxsaXN0eV8yMDA2LGxpc3R5XzIwMDcsbGlzdHlfMjAwOCkgJT4lDQojICBmdWxsX2pvaW4oLix6YXBpc3ksYnkgPSAiWkFfWkFQSVNfSUQiKSAlPiUNCiMgIHNlbGVjdChYNjUwLFg2NTUsRFpfRFpJQUxfSUQsRFpfTkFaV0EsWkFfU1RBVFVTX0lNUCkgJT4lDQojICBtdXRhdGUoWDY1MCA9IHN0cl9yZW1vdmVfYWxsKFg2NTAsIlxcXFw3IiksDQojICAgICAgICAgWDY1NSA9IHN0cl9yZW1vdmVfYWxsKFg2NTUsIlxcXFw3IiksDQojICAgICAgICAgWDY1MCA9IHN0cl9yZW1vdmVfYWxsKHN0cl9yZXBsYWNlX2FsbChYNjUwLCIoXFwkYSkiLCJcXFxcIzdcXDEiKSwiIyIpLA0KIyAgICAgICAgIFg2NTUgPSBzdHJfcmVtb3ZlX2FsbChzdHJfcmVwbGFjZV9hbGwoWDY1NSwiKFxcJGEpIiwiXFxcXCM3XFwxIiksIiMiKSkgJT4lDQojICBncm91cF9ieV9hdCh2YXJzKFg2NTA6RFpfTkFaV0EpKSAlPiUNCiMgIG11dGF0ZShaQV9TVEFUVVNfSU1QID0gcGFzdGUoWkFfU1RBVFVTX0lNUCxjb2xsYXBzZSA9ICJ8IikpICU+JQ0KIyAgdW5ncm91cCgpICU+JQ0KIyAgdW5pcXVlKCkgJT4lDQojICB1bmdyb3VwKCkgJT4lDQojICBmaWx0ZXIoIWdyZXBsKCJcXHwiLERaX0RaSUFMX0lEKSkgJT4lDQojICBmaWx0ZXIoZ3JlcGwoIklPSyIsWkFfU1RBVFVTX0lNUCkpICU+JQ0KIyAgZmlsdGVyKCFncmVwbCgiSU5PfElNUHxJUE58SVBDIixaQV9TVEFUVVNfSU1QKSkgJT4lDQojICBmaWx0ZXIoIWdyZXBsKCJvc29ib3dlIixEWl9OQVpXQSkpICU+JQ0KIyAgZmlsdGVyKCEoaXMubmEoWDY1MCkmaXMubmEoWDY1NSkpKSAlPiUNCiMgIG11dGF0ZShpbGU2NTAgPSBzdHJfY291bnQoWDY1MCwiXFx8IikrMSwNCiMgICAgICAgICBpbGU2NTUgPSBzdHJfY291bnQoWDY1NSwiXFx8IikrMSkgJT4lDQojICBmaWx0ZXIoaWxlNjUwPD0xMHxpbGU2NTU8PTEwKSAlPiUNCiMgIHNlbGVjdCgtaWxlNjUwLC1pbGU2NTUpICU+JQ0KIyAgbXV0YXRlKGlsZV9zdGF0dXNvdyA9IHN0cl9jb3VudChaQV9TVEFUVVNfSU1QLCJcXHwiKSsxKSAlPiUNCiMgIGFycmFuZ2UoWDY1NSxYNjUwLC1pbGVfc3RhdHVzb3cpDQojcG9wcnplZG5pZV9pbXBvcnR5JGlkX2dydXB5IDwtIGN1bXN1bSghZHVwbGljYXRlZChwb3ByemVkbmllX2ltcG9ydHlbMToyXSkpDQojcG9wcnplZG5pZV9pbXBvcnR5IDwtIHBvcHJ6ZWRuaWVfaW1wb3J0eVshZHVwbGljYXRlZChwb3ByemVkbmllX2ltcG9ydHkkaWRfZ3J1cHkpLF0gJT4lDQojICBtdXRhdGUoaWQgPSByb3dfbnVtYmVyKCkpICU+JQ0KIyAgc2VsZWN0KC1pbGVfc3RhdHVzb3csLWlkX2dydXB5KQ0KIw0KI2RvX2R6aWFsb3dhbmlhIDwtIGRhdGEuZnJhbWUoaWQgPSBhcy5pbnRlZ2VyKCksIFg2NTAgPSBhcy5jaGFyYWN0ZXIoKSwgWDY1NSA9IGFzLmNoYXJhY3RlcigpLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpDQojeCA8LSAxOmxlbmd0aChwb3ByemVkbmllX2ltcG9ydHkkaWQpDQojZm9yIChpIGluIHgpew0KIyAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiMgICAgaWYgKGlzLm5hKHBvcHJ6ZWRuaWVfaW1wb3J0eSRYNjUwW2ldKSYhaXMubmEocG9wcnplZG5pZV9pbXBvcnR5JFg2NTVbaV0pKXsNCiMgICAgICBwZXJtdXRhdGlvbnMgPC0gYXMuZGF0YS5mcmFtZShwZXJtdXRhdGlvbnModW5saXN0KHN0cl9zcGxpdChwb3ByemVkbmllX2ltcG9ydHkkWDY1NVtpXSwiXFx8IikpLCBzdHJfY291bnQocG9wcnplZG5pZV9pbXBvcnR5JFg2NTVbaV0sIlxcfCIpKzEpKSAlPiUNCiMgICAgICAgIHVuaXRlKGRhdGE9Lixjb2wgPSAicGVybXV0YXRpb24iLCBzZXAgPSAifCIpICU+JQ0KIyAgICAgICAgbXV0YXRlKFg2NTAgPSBOQSwNCiMgICAgICAgICAgICAgICBYNjU1ID0gcGVybXV0YXRpb24sDQojICAgICAgICAgICAgICAgaWQgPSBwb3ByemVkbmllX2ltcG9ydHkkaWRbaV0pICU+JQ0KIyAgICAgICAgc2VsZWN0KGlkLFg2NTAsWDY1NSkNCiMgICAgICBkb19kemlhbG93YW5pYSA8LSByYmluZChkb19kemlhbG93YW5pYSxwZXJtdXRhdGlvbnMpDQojICAgIH0gZWxzZSBpZiAoaXMubmEocG9wcnplZG5pZV9pbXBvcnR5JFg2NTVbaV0pJiFpcy5uYShwb3ByemVkbmllX2ltcG9ydHkkWDY1MFtpXSkpew0KIyAgICAgIHBlcm11dGF0aW9ucyA8LSBhcy5kYXRhLmZyYW1lKHBlcm11dGF0aW9ucyh1bmxpc3Qoc3RyX3NwbGl0KHBvcHJ6ZWRuaWVfaW1wb3J0eSRYNjUwW2ldLCJcXHwiKSksIHN0cl9jb3VudChwb3ByemVkbmllX2ltcG9ydHkkWDY1MFtpXSwiXFx8IikrMSkpICU+JQ0KIyAgICAgICAgdW5pdGUoZGF0YT0uLGNvbCA9ICJwZXJtdXRhdGlvbiIsIHNlcCA9ICJ8IikgJT4lDQojICAgICAgICBtdXRhdGUoWDY1MCA9IHBlcm11dGF0aW9uLA0KIyAgICAgICAgICAgICAgIFg2NTUgPSBOQSwNCiMgICAgICAgICAgICAgICBpZCA9IHBvcHJ6ZWRuaWVfaW1wb3J0eSRpZFtpXSkgJT4lDQojICAgICAgICBzZWxlY3QoaWQsWDY1MCxYNjU1KQ0KIyAgICAgIGRvX2R6aWFsb3dhbmlhIDwtIHJiaW5kKGRvX2R6aWFsb3dhbmlhLHBlcm11dGF0aW9ucykNCiMgICAgfSBlbHNlIHsNCiMgICAgICBwZXJtdXRhdGlvbnMgPC0gYXMuZGF0YS5mcmFtZShwZXJtdXRhdGlvbnModW5saXN0KHN0cl9zcGxpdChwb3ByemVkbmllX2ltcG9ydHkkWDY1MFtpXSwiXFx8IikpLCBzdHJfY291bnQocG9wcnplZG5pZV9pbXBvcnR5JFg2NTBbaV0sIlxcfCIpKzEpKSAlPiUNCiMgICAgICAgIHVuaXRlKGRhdGE9Lixjb2wgPSAicGVybXV0YXRpb24iLCBzZXAgPSAifCIpICU+JQ0KIyAgICAgICAgbXV0YXRlKFg2NTAgPSBwZXJtdXRhdGlvbiwNCiMgICAgICAgICAgICAgICBpZCA9IHBvcHJ6ZWRuaWVfaW1wb3J0eSRpZFtpXSkgJT4lDQojICAgICAgICBzZWxlY3QoaWQsWDY1MCkNCiMgICAgICBwZXJtdXRhdGlvbnM2NTAgPC0gZGF0YS5mcmFtZShzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpDQojICAgICAgcGVybXV0YXRpb25zNjUwIDwtIHJiaW5kKHBlcm11dGF0aW9uczY1MCxwZXJtdXRhdGlvbnMpDQojICAgICAgcGVybXV0YXRpb25zIDwtIGFzLmRhdGEuZnJhbWUocGVybXV0YXRpb25zKHVubGlzdChzdHJfc3BsaXQocG9wcnplZG5pZV9pbXBvcnR5JFg2NTVbaV0sIlxcfCIpKSwgc3RyX2NvdW50KHBvcHJ6ZWRuaWVfaW1wb3J0eSRYNjU1W2ldLCJcXHwiKSsxKSkgJT4lDQojICAgICAgICB1bml0ZShkYXRhPS4sY29sID0gInBlcm11dGF0aW9uIiwgc2VwID0gInwiKSAlPiUNCiMgICAgICAgIG11dGF0ZShYNjU1ID0gcGVybXV0YXRpb24sDQojICAgICAgICAgICAgICAgaWQgPSBwb3ByemVkbmllX2ltcG9ydHkkaWRbaV0pICU+JQ0KIyAgICAgICAgc2VsZWN0KGlkLFg2NTUpDQojICAgICAgcGVybXV0YXRpb25zNjU1IDwtIGRhdGEuZnJhbWUoc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQ0KIyAgICAgIHBlcm11dGF0aW9uczY1NSA8LSByYmluZChwZXJtdXRhdGlvbnM2NTUscGVybXV0YXRpb25zKQ0KIyAgICAgIHBlcm11dGF0aW9ucyA8LSBtZXJnZShwZXJtdXRhdGlvbnM2NTAscGVybXV0YXRpb25zNjU1LGJ5ID0gImlkIixhbGwgPSBUUlVFKSAlPiUNCiMgICAgICAgIHNlbGVjdChpZCxYNjUwLFg2NTUpDQojICAgICAgZG9fZHppYWxvd2FuaWEgPC0gcmJpbmQoZG9fZHppYWxvd2FuaWEscGVybXV0YXRpb25zKQ0KIyAgICB9DQojfQ0KIw0KI2RvX2R6aWFsb3dhbmlhIDwtIGRvX2R6aWFsb3dhbmlhICU+JQ0KIyAgZnVsbF9qb2luKC4scG9wcnplZG5pZV9pbXBvcnR5ICU+JSBzZWxlY3QoaWQsRFpfRFpJQUxfSUQsRFpfTkFaV0EpLGJ5ID0gImlkIikgJT4lDQojICBzZWxlY3QoLWlkKQ0KI2RvX2R6aWFsb3dhbmlhW2lzLm5hKGRvX2R6aWFsb3dhbmlhKV0gPC0gIiINCiMjIyMjdHV0YWogc3ByYXdkemnEhw0KI2RvX2R6aWFsb3dhbmlhX3ByemVkbSA8LSBtZXJnZShibl9vayAlPiUgZmlsdGVyKGN6eV9hdXRvbWF0eWN6bmllPT0ibmllIiZyb2R6YWpfa3NpYXpraT09InByemVkbWlvdG93YSIpLGRvX2R6aWFsb3dhbmlhLCBieSA9IGMoIlg2NTAiLCJYNjU1IikpICU+JQ0KIyAgc2VsZWN0KGlkLERaX0RaSUFMX0lELERaX05BWldBKQ0KYGBgDQoNCmBgYHtyIHdjenl0YW5pZSBkYW55Y2ggUEJMfQ0KI3djenl0YW5pZSBrYXJ0b3RlayBQQkwNCnJlZGFrdG9yenlfZHppYWxvdyA8LSBzaGVldHNfcmVhZChzcyA9ICIxQmFqZS1aZlBnQUtFREFvRHplb19lQ0JEcnNMN2pBWHQ2dWJQMmNlZGJGYyIsIHNoZWV0ID0gInJlZGFrdG9yenlfZHppYcWCw7N3IikgJT4lDQogIHNlbGVjdChEWl9EWklBTF9JRCwgRFpfTkFaV0EsIHJlZGFrdG9yX2R6aWFsdSkgIyU+JQ0KICAjbXV0YXRlKERaX0RaSUFMX0lEID0gYXMuY2hhcmFjdGVyKERaX0RaSUFMX0lEKSkNCg0KUEJMX2R6aWFseSA8LSBkYlJlYWRUYWJsZShQQkwsJ1BCTF9EWklBTFknKSAlPiUNCiAgc2VsZWN0KDEsMyw2KQ0KDQpQQkxfZHppYWx5X3BhdGggPC0gbWVyZ2UoeCA9IFBCTF9kemlhbHksIHkgPSBQQkxfZHppYWx5LCBieS54ID0gIkRaX0RaX0RaSUFMX0lEIiwgYnkueSA9ICJEWl9EWklBTF9JRCIsIGFsbC54ID0gVFJVRSkNCmNvbG5hbWVzKFBCTF9kemlhbHlfcGF0aCkgPC0gYygiTkFEX0RaX0RaSUFMX0lEIiwgIkRaX0RaSUFMX0lEIiwgIkRaX05BWldBIiwgIk5BRF9EWl9OQVpXQSIsICJOQURfTkFEX0RaX0RaSUFMX0lEIikNCg0KUEJMX2R6aWFseV9wYXRoIDwtIG1lcmdlKHggPSBQQkxfZHppYWx5X3BhdGgsIHkgPSBQQkxfZHppYWx5LCBieS54ID0gIk5BRF9OQURfRFpfRFpJQUxfSUQiLCBieS55ID0gIkRaX0RaSUFMX0lEIiwgYWxsLnggPSBUUlVFKQ0KY29sbmFtZXMoUEJMX2R6aWFseV9wYXRoKSA8LSBjKCJOQURfTkFEX0RaX0RaSUFMX0lEIiwgIk5BRF9EWl9EWklBTF9JRCIsICJEWl9EWklBTF9JRCIsICJEWl9OQVpXQSIsICJOQURfRFpfTkFaV0EiLCAiTkFEX05BRF9EWl9OQVpXQSIsICJOQURfTkFEX05BRF9EWl9EWklBTF9JRCIpDQoNClBCTF9kemlhbHlfcGF0aCA8LSBtZXJnZSh4ID0gUEJMX2R6aWFseV9wYXRoLCB5ID0gUEJMX2R6aWFseSwgYnkueCA9ICJOQURfTkFEX05BRF9EWl9EWklBTF9JRCIsIGJ5LnkgPSAiRFpfRFpJQUxfSUQiLCBhbGwueCA9IFRSVUUpDQpjb2xuYW1lcyhQQkxfZHppYWx5X3BhdGgpIDwtIGMoIk5BRF9OQURfTkFEX0RaX0RaSUFMX0lEIiwgIk5BRF9OQURfRFpfRFpJQUxfSUQiLCAiTkFEX0RaX0RaSUFMX0lEIiwgIkRaX0RaSUFMX0lEIiwgIkRaX05BWldBIiwgIk5BRF9EWl9OQVpXQSIsICJOQURfTkFEX0RaX05BWldBIiwgIk5BRF9OQURfTkFEX0RaX05BWldBIiwgIk5BRF9OQURfTkFEX05BRF9EWl9EWklBTF9JRCIpDQoNClBCTF9kemlhbHlfcGF0aCA8LSBtZXJnZSh4ID0gUEJMX2R6aWFseV9wYXRoLCB5ID0gUEJMX2R6aWFseSwgYnkueCA9ICJOQURfTkFEX05BRF9OQURfRFpfRFpJQUxfSUQiLCBieS55ID0gIkRaX0RaSUFMX0lEIiwgYWxsLnggPSBUUlVFKQ0KY29sbmFtZXMoUEJMX2R6aWFseV9wYXRoKSA8LSBjKCJOQURfTkFEX05BRF9OQURfRFpfRFpJQUxfSUQiLCAiTkFEX05BRF9OQURfRFpfRFpJQUxfSUQiLCAiTkFEX05BRF9EWl9EWklBTF9JRCIsICJOQURfRFpfRFpJQUxfSUQiLCAiRFpfRFpJQUxfSUQiLCAiRFpfTkFaV0EiLCAiTkFEX0RaX05BWldBIiwgIk5BRF9OQURfRFpfTkFaV0EiLCAiTkFEX05BRF9OQURfRFpfTkFaV0EiLCAiTkFEX05BRF9OQURfTkFEX0RaX05BWldBIiwgIk5BRF9OQURfTkFEX05BRF9OQURfRFpfRFpJQUxfSUQiKQ0KDQpQQkxfZHppYWx5X3BhdGggPC0gbWVyZ2UoeCA9IFBCTF9kemlhbHlfcGF0aCwgeSA9IFBCTF9kemlhbHksIGJ5LnggPSAiTkFEX05BRF9OQURfTkFEX05BRF9EWl9EWklBTF9JRCIsIGJ5LnkgPSAiRFpfRFpJQUxfSUQiLCBhbGwueCA9IFRSVUUpDQpjb2xuYW1lcyhQQkxfZHppYWx5X3BhdGgpIDwtIGMoIk5BRF9OQURfTkFEX05BRF9OQURfRFpfRFpJQUxfSUQiLCAiTkFEX05BRF9OQURfTkFEX0RaX0RaSUFMX0lEIiwgIk5BRF9OQURfTkFEX0RaX0RaSUFMX0lEIiwgIk5BRF9OQURfRFpfRFpJQUxfSUQiLCAiTkFEX0RaX0RaSUFMX0lEIiwgIkRaX0RaSUFMX0lEIiwgIkRaX05BWldBIiwgIk5BRF9EWl9OQVpXQSIsICJOQURfTkFEX0RaX05BWldBIiwgIk5BRF9OQURfTkFEX0RaX05BWldBIiwgIk5BRF9OQURfTkFEX05BRF9EWl9OQVpXQSIsICJOQURfTkFEX05BRF9OQURfTkFEX0RaX05BWldBIiwgIk5BRF9OQURfTkFEX05BRF9OQURfTkFEX0RaX0RaSUFMX0lEIikNCg0KUEJMX2R6aWFseV9wYXRoIDwtIFBCTF9kemlhbHlfcGF0aCAlPiUNCiAgc2VsZWN0KC1sZW5ndGgoUEJMX2R6aWFseV9wYXRoKSkgJT4lDQogIGZpbHRlcihEWl9EWklBTF9JRCE9MCkgJT4lDQogIHNlbGVjdCg2LDcsNSw4LDQsOSwzLDEwLDIsMTEsMSwxMikgJT4lDQogIHVuaXF1ZSgpDQoNClBCTF9kel9vc29iIDwtIFBCTF9kemlhbHlfcGF0aCAlPiUNCiAgZmlsdGVyKGdyZXBsKCJvc29ib3dlIiwgRFpfTkFaV0EpfGdyZXBsKCJvc29ib3dlIiwgTkFEX0RaX05BWldBKXxncmVwbCgib3NvYm93ZSIsIE5BRF9OQURfRFpfTkFaV0EpfGdyZXBsKCJvc29ib3dlIiwgTkFEX05BRF9OQURfRFpfTkFaV0EpfGdyZXBsKCJvc29ib3dlIiwgTkFEX05BRF9OQURfTkFEX0RaX05BWldBKXxncmVwbCgib3NvYm93ZSIsIE5BRF9OQURfTkFEX05BRF9OQURfRFpfTkFaV0EpKSAlPiUNCiAgc2VsZWN0KDEsMiwzLDQsNSw2LDcsOCkgJT4lDQogIGZpbHRlcihEWl9EWklBTF9JRCE9MTQ4KQ0KDQpQQkxfZHpfb3NvYl8xIDwtIFBCTF9kel9vc29iICU+JQ0KICBzZWxlY3QoMSwyLDMsNCkNClBCTF9kel9vc29iXzIgPC0gUEJMX2R6X29zb2IgJT4lDQogIHNlbGVjdCgxLDIsNSw2KQ0KUEJMX2R6X29zb2JfMyA8LSBQQkxfZHpfb3NvYiAlPiUNCiAgc2VsZWN0KDEsMiw3LDgpDQpjb2xuYW1lcyhQQkxfZHpfb3NvYl8yKSA8LSBjKG5hbWVzKFBCTF9kel9vc29iXzEpKQ0KY29sbmFtZXMoUEJMX2R6X29zb2JfMykgPC0gYyhuYW1lcyhQQkxfZHpfb3NvYl8xKSkNClBCTF9kel9vc29iIDwtIHJiaW5kKFBCTF9kel9vc29iXzEsUEJMX2R6X29zb2JfMixQQkxfZHpfb3NvYl8zKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShOQURfRFpfRFpJQUxfSUQpKSAlPiUNCiAgdW5pcXVlKCkNClBCTF9kel9vc29iIDwtIHJiaW5kKFBCTF9kel9vc29iLCBjKCIxNTA0MyIsICJIYXPFgmEgb3NvYm93ZShsdWtzZW1idXJza2EpIiwiMTUwNDMiLCAiSGFzxYJhIG9zb2Jvd2UobHVrc2VtYnVyc2thKSIpLCBjKCI0MzAiLCAiSGFzxYJhIG9zb2Jvd2UgKEx1ZHppZSB0ZWF0cnUgaSBmaWxtdSkiLCI0MzAiLCAiSGFzxYJhIG9zb2Jvd2UgKEx1ZHppZSB0ZWF0cnUgaSBmaWxtdSkiKSkNClBCTF9kel9vc29iX2Jlel90ZWF0cnUgPC0gUEJMX2R6X29zb2IgJT4lDQogIGZpbHRlcihEWl9EWklBTF9JRCE9NDMwKQ0KDQpQQkxfdHdvcmN5IDwtIGRiUmVhZFRhYmxlKFBCTCwnUEJMX1RXT1JDWScpDQp0d19pX2R6X3BvZG0gPC0gbWVyZ2UoeD1QQkxfdHdvcmN5LHk9UEJMX2R6X29zb2JfYmV6X3RlYXRydSwgYnkueCA9ICJUV19EWl9EWklBTF9JRCIsIGJ5LnkgPSAiTkFEX0RaX0RaSUFMX0lEIiwgYWxsLnggPSBUUlVFKSAlPiUNCiAgYXJyYW5nZShUV19UV09SQ0FfSUQpDQoNCnR3X2lfZHpfcG9kbSA8LSBkYXRhLmZyYW1lKHR3X2lfZHpfcG9kbSwgcG9sX29zb2IgPSBpZmVsc2UodHdfaV9kel9wb2RtJFRXX0RaX0RaSUFMX0lEID09IDE0OCAmIHN1YnN0cih0d19pX2R6X3BvZG0kVFdfTkFaV0lTS08sMSwxKT09c3RyX3N1Yih0d19pX2R6X3BvZG0kRFpfTkFaV0EsbmNoYXIoYXMuY2hhcmFjdGVyKHR3X2lfZHpfcG9kbSREWl9OQVpXQSkpLG5jaGFyKGFzLmNoYXJhY3Rlcih0d19pX2R6X3BvZG0kRFpfTkFaV0EpKSksVFJVRSxGQUxTRSksIHBvbCA9IGlmZWxzZSh0d19pX2R6X3BvZG0kVFdfRFpfRFpJQUxfSUQgPT0gMTQ4LCBUUlVFLCBGQUxTRSkpICU+JQ0KICBmaWx0ZXIocG9sX29zb2IgPT0gVFJVRSB8IHBvbCA9PSBGQUxTRSkNClBCTF90d29yY3lfcG9kbSA8LSB0d19pX2R6X3BvZG0gJT4lDQogIHNlbGVjdChUV19UV09SQ0FfSUQsIFRXX05BWldJU0tPLCBUV19JTUlFLCBEWl9EWklBTF9JRCwgRFpfTkFaV0EsIFRXX05BWldfV0xBU0NJV0UsIFRXX1BTRVVET05JTVksIFRXX0RBVEFfVVJPRFpJTiwgVFdfREFUQV9aR09OVSwgVFdfUk9DWk5JS0lfUEJMLCBUV19TTE9XQV9LTFVDWk9XRSwgVFdfVVdBR0ksIFRXX1JPS19VUk9EWklOLCBUV19ST0tfWkdPTlUsIFRXX0xJQ1pCQV9aQVBJU09XLCBUV19BRE5PVEFDSkUsIFRXX1RSQU5TTElURVJBQ0pFKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShEWl9EWklBTF9JRCkpDQpjb2xuYW1lcyhQQkxfdHdvcmN5X3BvZG0pIDwtIGMoIlRXX1RXT1JDQV9JRCIsICJUV19OQVpXSVNLTyIsICJUV19JTUlFIiwgIlRXX0RaX0RaSUFMX0lEIiwgIkRaX05BWldBIiwgIlRXX05BWldfV0xBU0NJV0UiLCAiVFdfUFNFVURPTklNWSIsICJUV19EQVRBX1VST0RaSU4iLCAiVFdfREFUQV9aR09OVSIsICJUV19ST0NaTklLSV9QQkwiLCAiVFdfU0xPV0FfS0xVQ1pPV0UiLCAiVFdfVVdBR0kiLCAiVFdfUk9LX1VST0RaSU4iLCAiVFdfUk9LX1pHT05VIiwgIlRXX0xJQ1pCQV9aQVBJU09XIiwgIlRXX0FETk9UQUNKRSIsICJUV19UUkFOU0xJVEVSQUNKRSIpDQpQQkxfdHdvcmN5X3BvZG0gPC0gUEJMX3R3b3JjeV9wb2RtICU+JQ0KICBtdXRhdGUobmF6d2EgPSBpZmVsc2UoaXMubmEoVFdfSU1JRSksYXMuY2hhcmFjdGVyKFRXX05BWldJU0tPKSxwYXN0ZShUV19OQVpXSVNLTyxUV19JTUlFLCBzZXAgPSAiIikpLA0KICAgICAgICAgbmF6d2EgPSBzdHJfdG9fbG93ZXIoc3RyX3JlcGxhY2VfYWxsKG5hendhLCAiXFxXIiwgIiIpKSwNCiAgICAgICAgIG5hendhID0gc3RyX3JlcGxhY2VfYWxsKHN0cl90b19sb3dlcihuYXp3YSksICJcXFciLCAiIikpDQoNCnR3X2lfZHogPC0gbWVyZ2UoeD1QQkxfdHdvcmN5LHk9UEJMX2R6X29zb2IsIGJ5LnggPSAiVFdfRFpfRFpJQUxfSUQiLCBieS55ID0gIk5BRF9EWl9EWklBTF9JRCIsIGFsbC54ID0gVFJVRSkgJT4lDQogIGFycmFuZ2UoVFdfVFdPUkNBX0lEKQ0KdHdfaV9keiA8LSBkYXRhLmZyYW1lKHR3X2lfZHosIHBvbF9vc29iID0gaWZlbHNlKHR3X2lfZHokVFdfRFpfRFpJQUxfSUQgPT0gMTQ4ICYgc3Vic3RyKHR3X2lfZHokVFdfTkFaV0lTS08sMSwxKT09c3RyX3N1Yih0d19pX2R6JERaX05BWldBLG5jaGFyKGFzLmNoYXJhY3Rlcih0d19pX2R6JERaX05BWldBKSksbmNoYXIoYXMuY2hhcmFjdGVyKHR3X2lfZHokRFpfTkFaV0EpKSksVFJVRSxGQUxTRSksIHBvbCA9IGlmZWxzZSh0d19pX2R6JFRXX0RaX0RaSUFMX0lEID09IDE0OCwgVFJVRSwgRkFMU0UpKSAlPiUNCiAgZmlsdGVyKHBvbF9vc29iID09IFRSVUUgfCBwb2wgPT0gRkFMU0UpDQpQQkxfdHdvcmN5IDwtIHR3X2lfZHogJT4lDQogIHNlbGVjdChUV19UV09SQ0FfSUQsIFRXX05BWldJU0tPLCBUV19JTUlFLCBEWl9EWklBTF9JRCwgRFpfTkFaV0EsIFRXX05BWldfV0xBU0NJV0UsIFRXX1BTRVVET05JTVksIFRXX0RBVEFfVVJPRFpJTiwgVFdfREFUQV9aR09OVSwgVFdfUk9DWk5JS0lfUEJMLCBUV19TTE9XQV9LTFVDWk9XRSwgVFdfVVdBR0ksIFRXX1JPS19VUk9EWklOLCBUV19ST0tfWkdPTlUsIFRXX0xJQ1pCQV9aQVBJU09XLCBUV19BRE5PVEFDSkUsIFRXX1RSQU5TTElURVJBQ0pFKQ0KY29sbmFtZXMoUEJMX3R3b3JjeSkgPC0gYygiVFdfVFdPUkNBX0lEIiwgIlRXX05BWldJU0tPIiwgIlRXX0lNSUUiLCAiVFdfRFpfRFpJQUxfSUQiLCAiRFpfTkFaV0EiLCAiVFdfTkFaV19XTEFTQ0lXRSIsICJUV19QU0VVRE9OSU1ZIiwgIlRXX0RBVEFfVVJPRFpJTiIsICJUV19EQVRBX1pHT05VIiwgIlRXX1JPQ1pOSUtJX1BCTCIsICJUV19TTE9XQV9LTFVDWk9XRSIsICJUV19VV0FHSSIsICJUV19ST0tfVVJPRFpJTiIsICJUV19ST0tfWkdPTlUiLCAiVFdfTElDWkJBX1pBUElTT1ciLCAiVFdfQUROT1RBQ0pFIiwgIlRXX1RSQU5TTElURVJBQ0pFIikNClBCTF90d29yY3kgPC0gUEJMX3R3b3JjeSAlPiUNCiAgbXV0YXRlKG5hendhID0gaWZlbHNlKGlzLm5hKFRXX0lNSUUpLGFzLmNoYXJhY3RlcihUV19OQVpXSVNLTykscGFzdGUoVFdfTkFaV0lTS08sVFdfSU1JRSwgc2VwID0gIiIpKSwNCiAgICAgICAgIG5hendhID0gc3RyX3RvX2xvd2VyKHN0cl9yZXBsYWNlX2FsbChuYXp3YSwgIlxcVyIsICIiKSksDQogICAgICAgICBuYXp3YSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfdG9fbG93ZXIobmF6d2EpLCAiXFxXIiwgIiIpLA0KICAgICAgICAgVFdfRFpfRFpJQUxfSUQgPSBhcy5udW1lcmljKFRXX0RaX0RaSUFMX0lEKSkNCg0KUEJMX2F1dG9yenkgPC0gZGJSZWFkVGFibGUoUEJMLCdQQkxfQVVUT1JaWScpICU+JQ0KICBtdXRhdGUobmF6d2EgPSBpZmVsc2UoaXMubmEoQU1fSU1JRSksYXMuY2hhcmFjdGVyKEFNX05BWldJU0tPKSxwYXN0ZShBTV9OQVpXSVNLTyxBTV9JTUlFLCBzZXAgPSAiIikpLA0KICAgICAgICAgbmF6d2EgPSBzdHJfdG9fbG93ZXIoc3RyX3JlcGxhY2VfYWxsKG5hendhLCAiXFxXIiwgIiIpKSwNCiAgICAgICAgIG5hendhID0gc3RyX3JlcGxhY2VfYWxsKHN0cl90b19sb3dlcihuYXp3YSksICJcXFciLCAiIikpICU+JQ0KICBmaWx0ZXIobmF6d2EgIT0gIm5hbmEiKQ0KDQpQQkxfd3Nwb2x0d29yY3kgPC0gZGJSZWFkVGFibGUoUEJMLCdQQkxfT1NPQlknKSAlPiUNCiAgbXV0YXRlKG5hendhX3Byb3N0YSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfdG9fbG93ZXIoaWZlbHNlKGlzLm5hKE9TX0lNSUUpLGFzLmNoYXJhY3RlcihPU19OQVpXSVNLTykscGFzdGUoT1NfTkFaV0lTS08sT1NfSU1JRSwgc2VwID0gIiIpKSksICJcXFciLCAiIikpICU+JQ0KICBmaWx0ZXIobmF6d2FfcHJvc3RhICE9Im5hbmEiKQ0KDQpQQkxfZnVua2NqZSA8LSBzaGVldHNfcmVhZChzcyA9ICIxaHRuX0w2UkVzM0dkRzF4U2lHSElmcjZNSnZqbW1VX2tWR3hpTVp0Q1YyNCIsIHNoZWV0ID0gIkFya3VzejEiKQ0KDQpQQkxfd3lkYXduaWN0d2EgPC0gZGJSZWFkVGFibGUoUEJMLCdQQkxfV1lEQVdOSUNUV0EnKSAlPiUNCiAgbXV0YXRlKG5hendhX3Byb3N0YSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfdG9fbG93ZXIocGFzdGUoV1lfTUlBU1RPLCBXWV9OQVpXQSkpLCAiXFxXIiwgIiIpKSAlPiUNCiAgZmlsdGVyKG5hendhX3Byb3N0YSAhPSJuYW5hIikNCg0KUEJMX3JvZHphamVfemFwaXNvdyA8LSBkYlJlYWRUYWJsZShQQkwsJ1BCTF9ST0RaQUpFX1pBUElTT1cnKQ0KDQpCTl9QQkxfbGlzdGFfbGl0ZXJhdHVyIDwtIHNoZWV0c19yZWFkKHNzID0gIjF6YndqbnJ0V0d2YmpyUVRMTWF2SmNXU3U3SGZQMEktVVNOZ1pfS1dpWGpjIiwgc2hlZXQgPSAibGlzdGEgdWtkIGJuIikgJT4lDQogIGZpbHRlcighaXMubmEodWtkX29nb2xuZSkpICU+JQ0KICBzZWxlY3QoMzo5KSAlPiUNCiAgY1NwbGl0KC4sYygicGJsX2lkIiwicGJsX25hendhIiwicmVkYWt0b3JfZHppYWx1IiwicGJsX2lkX2xpdGVyYXR1cnkiLCJwYmxfbGl0ZXJhdHVyYSIpLHNlcCA9ICJ8IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHBibF9pZCkpDQoNClBCTF9oYXNsYV9vc29ib3dlIDwtIHNoZWV0c19yZWFkKHNzID0gIjF6YndqbnJ0V0d2YmpyUVRMTWF2SmNXU3U3SGZQMEktVVNOZ1pfS1dpWGpjIiwgc2hlZXQgPSAicGJsX2hhc2xhX29zb2Jvd2UiKSAlPiUNCiAgc2VsZWN0KDI6NSkNCmNvbG5hbWVzKFBCTF9oYXNsYV9vc29ib3dlKSA8LSBjKCJEWl9EWklBTF9JRCIsIkRaX05BWldBIiwicmVkYWt0b3JfZHppYWx1IiwibmF6d2EiKQ0KYGBgDQoNCmBgYHtyIHByenlnb3Rvd2FuaWUgd3Nww7PFgnd5ZGHFhH0NCmJuX29rIDwtIGNodW5rNw0KIyBwb2R6aWVsZW5pZSB1bmlrYXRvd3ljaCByZWtvcmTDs3cgYm4gbmEgZHdhIHdpZXJzemUgdyB0YWJlbGksIHoga3TDs3J5Y2ggcG93c3RhbsSFIGR3YSByZWtvcmR5IHBibA0KYm5fb2sgPC0gYm5fb2sgJT4lDQogIG11dGF0ZShaQV9VV0FHSSA9IDE6bnJvdyguKSkNCg0Kd3Nwb2x3eWRhbmlhX2ZpeCA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0id3Nww7PFgnd5ZGFuaWUiKSAlPiUNCiAgbXV0YXRlKFgyNDUgPSBpZmVsc2UoZ3JlcGwoIlxcXVxcLlteJF0iLFgyNDUpLHN0cl9yZXBsYWNlKFgyNDUsIihcXCRjKSguKikoXFxdXFwuICkoLiogXFwvIC4qKSIsIlxcMVxcMl18MTAkYVxcNCIpLHN0cl9yZXBsYWNlKFgyNDUsIihcXCRjKSguKj8pKD88IXTFgnxyZWQpKFxcLiApKC4qIFxcLyAuKikiLCJcXDFcXDJ8MTAkYVxcNCIpKSwNCiAgICAgICAgIFgyNDUgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NSwgIlxcL1teXFwkXSIsICIvJGMiKSkNCg0KIyB1c3VuacSZY2llIHplIHpiaW9ydSB3c3DDs8WCd3lkYXduaWN0dyAoYsSZZMSFIHDDs8W6bmllaiBwb8WCxIVjem9uZSkNCmJuX29rIDwtIGJuX29rICU+JSANCiAgZmlsdGVyKGlkICVub3RpbiUgd3Nwb2x3eWRhbmlhX2ZpeCRpZCkNCg0KIyB1c3VuacSZY2llIHogcG9sYSBYMjQ2IHdlcnNqaSB0eXR1xYLDs3csIGt0w7NyZSBuaWUgc8SFIHR5dHXFgmFtaSBvcnlnaW5hxYJ1DQptYXJjX2ZpZWxkXzI0NiA8LSB3c3BvbHd5ZGFuaWFfZml4ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NiklPiUNCiAgbXV0YXRlKFgyNDY9c3RyX3JlcGxhY2VfYWxsKFgyNDYsIihefFxcfCkiLCJ+XFwxIiksDQogICAgICAgICBYMjQ2ID0gaWZlbHNlKFgyNDY9PSJ+Iixhcy5jaGFyYWN0ZXIoWDI0Niksc3RyX3JlbW92ZShYMjQ2LCJefiIpKSkgJT4lDQogIGNTcGxpdCguLCJYMjQ2IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgbXV0YXRlKFgyNDY9c3RyX3JlbW92ZV9hbGwoWDI0NiwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMjQ2LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKHdzcG9sd3lkYW5pYV9maXgkWDI0NiwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI0NilbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNDY8LWNiaW5kKG1hcmNfZmllbGRfMjQ2LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjQ2JFgyNDYgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNDYkWDI0NixzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8yNDZbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8yNDYkWDI0Niksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMjQ2JFgyNDYpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfMjQ2IDwtIG1hcmNfZmllbGRfMjQ2WywgY29sU3Vtcyhpcy5uYShtYXJjX2ZpZWxkXzI0NikpICE9IG5yb3cobWFyY19maWVsZF8yNDYpXQ0KbWFyY19maWVsZF8yNDYgPC0gbWFyY19maWVsZF8yNDYgJT4lIA0KICBmaWx0ZXIoaXMubmEoYCRpYCl8YCRpYCE9IlR5dC4gcHJ6ZWvFgi46IikgJT4lIA0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NikgJT4lIA0KICBtdXRhdGUoWDI0NiA9IHN0cl9yZW1vdmVfYWxsKFgyNDYsIlxcfCIpKSAlPiUgDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUgDQogIG11dGF0ZShYMjQ2ID0gcGFzdGUoWDI0Nixjb2xsYXBzZSA9ICJ8IikpICU+JSANCiAgdW5ncm91cCgpICU+JSANCiAgdW5pcXVlKCkNCg0Kd3Nwb2x3eWRhbmlhX2ZpeCRYMjQ2IDwtIG1hcmNfZmllbGRfMjQ2JFgyNDYNCg0KIyBwb2R6aWHFgiBuYSBkd2EgcmVrb3JkeQ0Kd3Nwb2x3eWRhbmlhX2ZpeCA8LSB3c3BvbHd5ZGFuaWFfZml4ICU+JQ0KICBjU3BsaXQoYygiWDI0NSIsICJYMjQ2IiksIHNlcCA9ICJ8IiwgZGlyZWN0aW9uID0gImxvbmciKSAlPiUgDQogIGZpbHRlcighaXMubmEoWDI0NSkpDQoNCiMgem1pYW5hIHBvbGEgWkFfVVdBR0kgbmEgd2FydG/Fm8SHIHVuaWthdG93xIUNCndzcG9sd3lkYW5pYV9maXggJSQlICANCiAgICB7IFpBX1VXQUdJPT1sYWcoWkFfVVdBR0ksKX0gJT4lIA0KICAgIGFzLm51bWVyaWMoKSAlPiUgDQogICAgey59IC0+IHdzcG9sd3lkYW5pYV9maXgkc2FtZQ0Kd3Nwb2x3eWRhbmlhX2ZpeCRzYW1lWzFdIDwtIDANCndzcG9sd3lkYW5pYV9maXggPC0gd3Nwb2x3eWRhbmlhX2ZpeCAlPiUgDQogIG11dGF0ZShaQV9VV0FHSSA9IGlmZWxzZShzYW1lID09IDAsIHBhc3RlKHJvayxzcHJpbnRmKCIlMDVkIiwgYXMuaW50ZWdlcihaQV9VV0FHSSkpLCAiMCIsIHNlcCA9ICIiKSwgcGFzdGUocm9rLHNwcmludGYoIiUwNWQiLCBhcy5pbnRlZ2VyKFpBX1VXQUdJKSksICIxIiwgc2VwID0gIiIpKSkgJT4lIA0KICBzZWxlY3QoLXNhbWUpDQoNCiMgcG/FgsSFY3plbmllIHpiaW9yw7N3DQpibl9vayA8LSBibl9vayAlPiUgDQogIG11dGF0ZShaQV9VV0FHSSA9IHBhc3RlKHJvayxzcHJpbnRmKCIlMDVkIiwgYXMuaW50ZWdlcihaQV9VV0FHSSkpLHNlcCA9ICIiKSkgJT4lIA0KICBiaW5kX3Jvd3Mod3Nwb2x3eWRhbmlhX2ZpeCkNCmNodW5rMTAgPC0gYm5fb2sNCmBgYA0KDQoNCmBgYHtyIHByenlwaXNhbmllIHJlZGFrdG9yw7N3IGRvIHByemVkbWlvdG93ZWosIHBvZG1pb3Rvd2VqIGkgYW50b2xvZ2lpfQ0KYm5fb2sgPC0gY2h1bmsxMA0KcHJ6ZWRtaW90b3dhX3JlZGFrdG9yenkgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09InByemVkbWlvdG93YSIpDQojIyNwcnp5cGlzYW5pZSByZWRha3RvcmEgbmEgcG9kc3Rhd2llIG9zb2J5IHogNjAwIGpha28gdGVtYXR1IC0ga3NpxIXFvGtpIG8gdHfDs3JjeQ0KIzYwMA0KbWFyY19maWVsZF82MDAgPC0gcHJ6ZWRtaW90b3dhX3JlZGFrdG9yenkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNjAwKSU+JQ0KICBmaWx0ZXIoWDYwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDYwMD1zdHJfcmVwbGFjZV9hbGwoWDYwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNjAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg2MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg2MDA9c3RyX3JlbW92ZV9hbGwoWDYwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNjAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKHByemVkbWlvdG93YV9yZWRha3Rvcnp5JFg2MDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF82MDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNjAwPC1jYmluZChtYXJjX2ZpZWxkXzYwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzYwMCRYNjAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNjAwJFg2MDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNjAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNjAwJFg2MDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzYwMCRYNjAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzYwMCA8LSBtYXJjX2ZpZWxkXzYwMCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWAsYCRkYCxgJGNgKSAlPiUNCiAgbXV0YXRlKG5hbWUgPSBpZmVsc2UoIWlzLm5hKGAkY2ApJnN1YnN0cihgJGNgLG5jaGFyKGAkY2ApLG5jaGFyKGAkY2ApKT09IjsiLHBhc3RlKGAkYWAsYCRjYCxgJGRgLHNlcCA9ICIgIiksaWZlbHNlKCFpcy5uYShgJGRgKSxwYXN0ZShgJGFgLGAkZGAsc2VwID0gIiAiKSxhcy5jaGFyYWN0ZXIoYCRhYCkpKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxuYW1lKSAlPiUNCiAgbXV0YXRlKG5hbWUgPSBzdHJfcmVwbGFjZShuYW1lLCIoXFwpKShcXC4kKSIsIlxcMSIpLA0KICAgICAgICAgbmFtZSA9IHN0cl9yZXBsYWNlKG5hbWUsICIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKShcXC4kKSIsIlxcMSIpKQ0KDQptYXJjX2ZpZWxkXzYwMCA8LSBtYXJjX2ZpZWxkXzYwMCAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIGlubmVyX2pvaW4oLixwYmxfdmlhZixieSA9IGMoIm5hbWUiID0gIkJOX25hbWUiKSkgJT4lDQogIGxlZnRfam9pbiguLFBCTF90d29yY3ksYnkgPSBjKCJwYmxfaWQiPSJUV19UV09SQ0FfSUQiKSkgJT4lDQogIGxlZnRfam9pbiguLHJlZGFrdG9yenlfZHppYWxvdyxieSA9IGMoIlRXX0RaX0RaSUFMX0lEIj0iRFpfRFpJQUxfSUQiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxUV19UV09SQ0FfSUQ9cGJsX2lkLFRXX05BWldJU0tPLFRXX0lNSUUsVFdfRFpfRFpJQUxfSUQsRFpfTkFaV0E9RFpfTkFaV0EueCxyZWRha3Rvcl9kemlhbHUpDQpjb3VudCA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKG1hcmNfZmllbGRfNjAwJFpBX1VXQUdJKSkNCm1hcmNfZmllbGRfNjAwIDwtIG1lcmdlKG1hcmNfZmllbGRfNjAwLGNvdW50LGJ5LnggPSAiWkFfVVdBR0kiLCBieS55ID0gIlZhcjEiKSAlPiUNCiAgZmlsdGVyKEZyZXE8MikgJT4lDQogIHNlbGVjdCgtRnJlcSkgJT4lDQogIHJlbmFtZShEWl9EWklBTF9JRD1UV19EWl9EWklBTF9JRCkgJT4lDQogIG11dGF0ZShSWl9ST0RaQUpfSUQgPSAyLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIG8gdHfDs3JjeSAocHJ6ZWRtaW90b3dhKSIpDQoNCiMjI3ByenlwaXNhbmllIGRvIHJlZGFrdG9yw7N3IG5hIHBvZHN0YXdpZSBsaXRlcmF0dXJ5IHogcG9sYSA2NTUNCnByemVkbWlvdG93YV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwcnplZG1pb3Rvd2EiKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgbWFyY19maWVsZF82MDAkWkFfVVdBR0kpDQoNCiM2NTUNCm1hcmNfZmllbGRfNjU1IDwtIHByemVkbWlvdG93YV9yZWRha3Rvcnp5ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDY1NSklPiUNCiAgZmlsdGVyKFg2NTUhPSIiKSAlPiUNCiAgbXV0YXRlKFg2NTU9c3RyX3JlcGxhY2VfYWxsKFg2NTUsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDY1NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNjU1IT0iIikgJT4lDQogIG11dGF0ZShYNjU1PXN0cl9yZW1vdmVfYWxsKFg2NTUsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDY1NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChwcnplZG1pb3Rvd2FfcmVkYWt0b3J6eSRYNjU1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNjU1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzY1NTwtY2JpbmQobWFyY19maWVsZF82NTUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF82NTUkWDY1NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzY1NSRYNjU1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzY1NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzY1NSRYNjU1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF82NTUkWDY1NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzY1NSA8LSBtYXJjX2ZpZWxkXzY1NSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWApICU+JQ0KICB1bmlxdWUoKQ0KDQpQQkxfbGl0ZXJhdHVyeV9vYmNlIDwtIFBCTF9kemlhbHlfcGF0aCAlPiUNCiAgZmlsdGVyKE5BRF9EWl9EWklBTF9JRD09MzApICU+JQ0KICBzZWxlY3QoMSwyKSAlPiUNCiAgbGVmdF9qb2luKC4scmVkYWt0b3J6eV9kemlhbG93LGJ5ID0gIkRaX0RaSUFMX0lEIikgJT4lDQogIGZpbHRlcighaXMubmEocmVkYWt0b3JfZHppYWx1KSkgJT4lDQogIHNlbGVjdCgxLERaX05BWldBID0gMiw0KSAlPiUNCiAgbXV0YXRlKG5hendhID0gc3Vic3RyKHN0cl9yZXBsYWNlKERaX05BWldBLCAiKC4qPykoICkoLio/KSIsIlxcMyIpLDEsbmNoYXIoc3RyX3JlcGxhY2UoRFpfTkFaV0EsICIoLio/KSggKSguKj8pIiwiXFwzIikpLTEpLA0KICAgICAgICAgbmF6d2EgPSBpZmVsc2UobmF6d2E9PSJyb21za2EgKGN5Z2HFhHNrYSIsInJvbXNrfGN5Z2HFhHNrIixhcy5jaGFyYWN0ZXIobmF6d2EpKSkNCg0KcmVjem5lIDwtIGRhdGEuZnJhbWUoRFpfRFpJQUxfSUQgPSBjKDMyLDMyLDMyLDMyLDU5LDg2LDEwNywxNDksNjcsNjksMzQsMzQsMzQsMzQsMzQsNTUsMzIsOTksMzQpLERaX05BWldBID0gYygiTGl0ZXJhdHVyYSBicnl0eWpza2EgaSBpcmxhbmR6a2EiLCJMaXRlcmF0dXJhIGJyeXR5anNrYSBpIGlybGFuZHprYSIsIkxpdGVyYXR1cmEgYnJ5dHlqc2thIGkgaXJsYW5kemthIiwiTGl0ZXJhdHVyYSBicnl0eWpza2EgaSBpcmxhbmR6a2EiLCJMaXRlcmF0dXJhIGdyZWNrYSBzdGFyb8W8eXRuYSIsIkxpdGVyYXR1cmEgxYJhY2nFhHNrYSDFm3JlZG5pb3dpZWN6bmEiLCJMaXRlcmF0dXJhIHN5cnlqc2thIiwiTGl0ZXJhdHVyYSBlc3BlcmFudG8iLCJMaXRlcmF0dXJhIGhvbGVuZGVyc2thIiwiTGl0ZXJhdHVyeSBJbmRpaSIsIkxpdGVyYXR1cnkgQWZyeWtpIFN1YnNhaGFyeWpza2llaiIsIkxpdGVyYXR1cnkgQWZyeWtpIFN1YnNhaGFyeWpza2llaiIsIkxpdGVyYXR1cnkgQWZyeWtpIFN1YnNhaGFyeWpza2llaiIsIkxpdGVyYXR1cnkgQWZyeWtpIFN1YnNhaGFyeWpza2llaiIsIkxpdGVyYXR1cnkgQWZyeWtpIFN1YnNhaGFyeWpza2llaiIsICJMaXRlcmF0dXJhIGVnaXBza28tYXJhYnNrYSIsICJMaXRlcmF0dXJhIGJyeXR5anNrYSBpIGlybGFuZHprYSIsIkxpdGVyYXR1cmEgcGFsZXN0ecWEc2tvLWFyYWJza2EiLCJMaXRlcmF0dXJ5IEFmcnlraSBTdWJzYWhhcnlqc2tpZWoiKSwgcmVkYWt0b3JfZHppYWx1ID0gYygiQkVBVEFLIiwiQkVBVEFLIiwiQkVBVEFLIiwiQkVBVEFLIiwiQkVBVEFTIiwiQkVBVEFTIiwiQkVBVEFEIiwiQ0VaQVJZIiwiVE9NQVNaVSIsIkVXQSIsIkVXQSIsIkVXQSIsIkVXQSIsIkVXQSIsIkVXQSIsIkJFQVRBRCIsIkJFQVRBSyIsIkJFQVRBRCIsIkVXQSIpLCBuYXp3YSA9IGMoImFuZ2llbHNrIiwic3prb2NrIiwiaXJsYW5kemsiLCJ3YWxpanNrIiwiZ3JlY2siLCLFgmFjacWEc2siLCJzeXJ5anNrIiwiZXNwZXJhbmNrIiwibmlkZXJsYW5kemsiLCJpbmR5anNrIiwicG/FgnVkbmlvd29hZnJ5a2EiLCJzZW5lZ2Fsc2siLCJuaWdlcnlqc2siLCJhZnJ5a2HFhHNrIiwicnVhbmR5anNrIiwiZWdpcHNrLiBub3dvxbx5dG4iLCJjZWx0eWNrIiwicGFsZXN0ecWEc2siLCJzb21hbGlqc2siKSkNCg0KUEJMX2xpdGVyYXR1cnlfb2JjZSA8LSByYmluZChQQkxfbGl0ZXJhdHVyeV9vYmNlLHJlY3puZSkNCg0KbWFyY19maWVsZF82NTUgPC0gc3FsZGYoInNlbGVjdCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBtYXJjX2ZpZWxkXzY1NSBhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBqb2luIFBCTF9saXRlcmF0dXJ5X29iY2UgYiBvbiBhLmAkYWAgbGlrZSAoJyUnfHxiLm5hendhfHwnJScpIikgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksRFpfRFpJQUxfSUQpDQoNCm1hcmNfZmllbGRfNjU1JHNhbWUgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjU1WzFdKSkNCm1hcmNfZmllbGRfNjU1IDwtIG1hcmNfZmllbGRfNjU1WyFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjU1JHNhbWUpLF0gJT4lDQogIHNlbGVjdChaQV9VV0FHSSxEWl9EWklBTF9JRCxEWl9OQVpXQSxyZWRha3Rvcl9kemlhbHUpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKERaX0RaSUFMX0lEKSkgJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSwNCiAgICAgICAgIFRXX05BWldJU0tPID0gTkEsDQogICAgICAgICBUV19JTUlFID0gTkEsDQogICAgICAgICBSWl9ST0RaQUpfSUQgPSAyMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB3IGhhxZtsZSByemVjem93eW0iKSAlPiUNCiAgc2VsZWN0KG5hbWVzKG1hcmNfZmllbGRfNjAwKSkNCiMjI3ByenlwaXNhbmllIGRvIHJlZGFrdG9yw7N3IG5hIHBvZHN0YXdpZSBsaXRlcmF0dXJ5IHogcG9sYSA2NTANCnByemVkbWlvdG93YV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwcnplZG1pb3Rvd2EiKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgbWFyY19maWVsZF82MDAkWkFfVVdBR0kpICU+JQ0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBtYXJjX2ZpZWxkXzY1NSRaQV9VV0FHSSkNCg0KIzY1MA0KbWFyY19maWVsZF82NTAgPC0gcHJ6ZWRtaW90b3dhX3JlZGFrdG9yenkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNjUwKSU+JQ0KICBmaWx0ZXIoWDY1MCE9IiIpICU+JQ0KICBtdXRhdGUoWDY1MD1zdHJfcmVwbGFjZV9hbGwoWDY1MCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNjUwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg2NTAhPSIiKSAlPiUNCiAgbXV0YXRlKFg2NTA9c3RyX3JlbW92ZV9hbGwoWDY1MCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNjUwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKHByemVkbWlvdG93YV9yZWRha3Rvcnp5JFg2NTAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF82NTApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNjUwPC1jYmluZChtYXJjX2ZpZWxkXzY1MCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzY1MCRYNjUwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNjUwJFg2NTAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNjUwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNjUwJFg2NTApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzY1MCRYNjUwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCm1hcmNfZmllbGRfNjUwIDwtIG1hcmNfZmllbGRfNjUwICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRhYCkgJT4lDQogIHVuaXF1ZSgpDQoNCm1hcmNfZmllbGRfNjUwIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gbWFyY19maWVsZF82NTAgYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBQQkxfbGl0ZXJhdHVyeV9vYmNlIGIgb24gYS5gJGFgIGxpa2UgKCclJ3x8Yi5uYXp3YXx8JyUnKSIpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLERaX0RaSUFMX0lEKQ0KDQptYXJjX2ZpZWxkXzY1MCRzYW1lIDwtIGN1bXN1bSghZHVwbGljYXRlZChtYXJjX2ZpZWxkXzY1MFsxXSkpDQptYXJjX2ZpZWxkXzY1MCA8LSBtYXJjX2ZpZWxkXzY1MFshZHVwbGljYXRlZChtYXJjX2ZpZWxkXzY1MCRzYW1lKSxdICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksRFpfRFpJQUxfSUQsRFpfTkFaV0EscmVkYWt0b3JfZHppYWx1KSAlPiUNCiAgZmlsdGVyKCFpcy5uYShEWl9EWklBTF9JRCkpICU+JQ0KICBtdXRhdGUoVFdfVFdPUkNBX0lEID0gTkEsDQogICAgICAgICBUV19OQVpXSVNLTyA9IE5BLA0KICAgICAgICAgVFdfSU1JRSA9IE5BLA0KICAgICAgICAgUlpfUk9EWkFKX0lEID0gMjEsDQogICAgICAgICBSWl9OQVpXQSA9ICJrc2nEhcW8a2EgdyBoYcWbbGUgcnplY3pvd3ltIikgJT4lDQogIHNlbGVjdChuYW1lcyhtYXJjX2ZpZWxkXzYwMCkpDQoNCmRvX3ByemVkbWlvdG93ZWoxIDwtIHJiaW5kKG1hcmNfZmllbGRfNjAwLG1hcmNfZmllbGRfNjU1LG1hcmNfZmllbGRfNjUwKQ0KDQojcHJ6eXBpc2FuaWUgbmEgcG9kc3Rhd2llIGRlc2tyeXB0b3LDs3cgdGVtYXR5Y3pueWNoIHogNjUwIGkgNjU1DQp6YXBpc3kgPC0gUkpEQkM6OmRiR2V0UXVlcnkoUEJMLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3Qgei56YV96YXBpc19pZCwgZHouZHpfZHppYWxfaWQsIGR6LmR6X25hendhLCByei5yel9yb2R6YWpfaWQsIHJ6LnJ6X25hendhLCB6LnphX3N0YXR1c19pbXAsIHouemFfdXdhZ2kNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHBibF96YXBpc3kgeg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4gcGJsX2R6aWFseSBkeiBvbiBkei5kel9kemlhbF9pZD16LnphX2R6X2R6aWFsMV9pZA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4gcGJsX3JvZHphamVfemFwaXNvdyByeiBvbiByei5yel9yb2R6YWpfaWQ9ei56YV9yel9yb2R6YWoxX2lkDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgei56YV91d2FnaSBsaWtlICclaW1wb3J0JSciKSAlPiUNCiAgbXV0YXRlKHByYWNvd25pa19wYmwgPSBzdHJfZXh0cmFjdChaQV9VV0FHSSwgIig/PD1ha2NlcHR1amU6KShbQS1aXSopIikpICU+JQ0KICBzZWxlY3QoLVpBX1VXQUdJKQ0KbmF6d3lfbGl0X29iY3ljaCA8LSBzdHJfcmVwbGFjZV9hbGwocGFzdGUoUEJMX2xpdGVyYXR1cnlfb2JjZSRuYXp3YSxjb2xsYXBzZSA9ICJ8IiksIlxcKCIsIlxcXFwoIikNCiNha3R1YWxpemFjamEgLSBkb2RhaiBkbyBza3J5cHR1IGxpc3TEmSB6IG9zdGF0bmltIGJyYWt1asSFY3ltIHphaW1wb3J0b3dhbnltIHJvY3puaWtpZW0NCnBvcHJ6ZWRuaWVfaW1wb3J0eSA8LSByYmluZChsaXN0eV8yMDA0LGxpc3R5XzIwMDUsbGlzdHlfMjAwNixsaXN0eV8yMDA3LGxpc3R5XzIwMDgsIGxpc3R5XzIwMDksIGxpc3R5XzIwMTAsIGxpc3R5XzIwMTEpICU+JQ0KICBmdWxsX2pvaW4oLix6YXBpc3ksYnkgPSAiWkFfWkFQSVNfSUQiKSAlPiUNCiAgc2VsZWN0KFpBX1pBUElTX0lELFg2NTAsWDY1NSxEWl9EWklBTF9JRCxEWl9OQVpXQSxSWl9ST0RaQUpfSUQsUlpfTkFaV0EscHJhY293bmlrX3BibCxaQV9TVEFUVVNfSU1QKSAlPiUNCiAgbXV0YXRlKFg2NTAgPSBzdHJfcmVtb3ZlX2FsbChYNjUwLCJcXFxcNyIpLA0KICAgICAgICAgWDY1NSA9IHN0cl9yZW1vdmVfYWxsKFg2NTUsIlxcXFw3IiksDQogICAgICAgICBYNjUwID0gc3RyX3JlbW92ZV9hbGwoc3RyX3JlcGxhY2VfYWxsKFg2NTAsIihcXCRhKSIsIlxcXFwjN1xcMSIpLCIjIiksDQogICAgICAgICBYNjU1ID0gc3RyX3JlbW92ZV9hbGwoc3RyX3JlcGxhY2VfYWxsKFg2NTUsIihcXCRhKSIsIlxcXFwjN1xcMSIpLCIjIikpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgZmlsdGVyKFJaX1JPRFpBSl9JRCAlbm90aW4lIGMoMCwxLDIsMjUwLDc2NCkpICU+JQ0KICBhcnJhbmdlKHByYWNvd25pa19wYmwsRFpfRFpJQUxfSUQpICU+JQ0KICBmaWx0ZXIoIWdyZXBsKG5hend5X2xpdF9vYmN5Y2gsWDY1MCkmIWdyZXBsKG5hend5X2xpdF9vYmN5Y2gsWDY1NSkpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHByYWNvd25pa19wYmwpKSAlPiUNCiAgZmlsdGVyKFpBX1NUQVRVU19JTVAgJWluJSBjKCJJT0siLCJJUEMiKSkNCg0KI3ByenlwaXNhbmllIG5hIHBvZHN0YXdpZSBjesSZc3RvdGxpd2/Fm2NpIGRlc2tyeXB0b3LDs3cgNjU1DQpwcnplZG1pb3Rvd2FfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0icHJ6ZWRtaW90b3dhIikgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3ByemVkbWlvdG93ZWoxJFpBX1VXQUdJKQ0KDQpkZXNrcnlwdG9yeTY1NSA8LSBwb3ByemVkbmllX2ltcG9ydHkgJT4lDQogIHNlbGVjdChYNjU1LHByYWNvd25pa19wYmwsRFpfRFpJQUxfSUQsRFpfTkFaV0EpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKFg2NTUpKSAlPiUNCiAgdW5pdGUoZGF0YT0uLGNvbCA9ICJkZXNrcnlwdG9yNjU1Iiwgc2VwID0gIn4iKQ0KDQpkZXNrcnlwdG9yeTY1NSA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGRlc2tyeXB0b3J5NjU1JGRlc2tyeXB0b3I2NTUpKSAlPiUNCiAgY1NwbGl0KC4sIlZhcjEiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAid2lkZSIpICU+JQ0KICByZW5hbWUoWDY1NSA9IFZhcjFfMSwNCiAgICAgICAgIHJlZGFrdG9yX2R6aWFsdSA9IFZhcjFfMiwNCiAgICAgICAgIERaX0RaSUFMX0lEID0gVmFyMV8zLA0KICAgICAgICAgRFpfTkFaV0EgPSBWYXIxXzQpICU+JQ0KICBtdXRhdGUoWDY1NSA9IHN0cl9yZW1vdmVfYWxsKFg2NTUsIlxcXFw3XFwkYSIpLA0KICAgICAgICAgWDY1NSA9IHN0cl9yZW1vdmVfYWxsKFg2NTUsIlxcJDJEQk4iKSwNCiAgICAgICAgIFg2NTUgPSBzdHJfcmVwbGFjZV9hbGwoWDY1NSwiXFwkLnxcXHwiLCIgIiksDQogICAgICAgICBYNjU1ID0gc3RyX3JlcGxhY2VfYWxsKFg2NTUsIiAiLCIuKiIpLA0KICAgICAgICAgWDY1NSA9IHN0cl9yZXBsYWNlX2FsbChYNjU1LCAiW15cXHB7TH1cXGRcXCpcXC5cXC1cXHNdIiwgIiIpKSAlPiUNCiAgYXJyYW5nZShYNjU1LC1GcmVxLERaX05BWldBKQ0KDQpkZXNrcnlwdG9yeTY1NSRpZF9ncnVweSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQoZGVza3J5cHRvcnk2NTVbMl0pKQ0KZGVza3J5cHRvcnk2NTUgPC0gZGVza3J5cHRvcnk2NTVbIWR1cGxpY2F0ZWQoZGVza3J5cHRvcnk2NTUkaWRfZ3J1cHkpLF0gJT4lDQogIHNlbGVjdCgtaWRfZ3J1cHkpICU+JQ0KICBhcnJhbmdlKC1GcmVxKQ0KDQp4IDwtIDE6bGVuZ3RoKGRlc2tyeXB0b3J5NjU1JFg2NTUpDQp0ZXN0IDwtIGRhdGEuZnJhbWUoc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQ0KDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogICAgZG9fcHJ6ZWRtaW90b3dlajIgPC0gcHJ6ZWRtaW90b3dhX3JlZGFrdG9yenkgJT4lDQogICAgICBtdXRhdGUocmVkYWt0b3JfZHppYWx1ID0gaWZlbHNlKGdyZXBsKGRlc2tyeXB0b3J5NjU1JFg2NTVbaV0sWDY1NSksYXMuY2hhcmFjdGVyKGRlc2tyeXB0b3J5NjU1JHJlZGFrdG9yX2R6aWFsdSlbaV0sTkEpLA0KICAgICAgICAgICAgIGlsZSA9IGlmZWxzZShncmVwbChkZXNrcnlwdG9yeTY1NSRYNjU1W2ldLFg2NTUpLGFzLmludGVnZXIoZGVza3J5cHRvcnk2NTUkRnJlcSlbaV0sTkEpLA0KICAgICAgICAgICAgIGNvID0gaWZlbHNlKGdyZXBsKGRlc2tyeXB0b3J5NjU1JFg2NTVbaV0sWDY1NSksYXMuY2hhcmFjdGVyKGRlc2tyeXB0b3J5NjU1JFg2NTUpW2ldLE5BKSwNCiAgICAgICAgICAgICBEWl9EWklBTF9JRCA9IGlmZWxzZShncmVwbChkZXNrcnlwdG9yeTY1NSRYNjU1W2ldLFg2NTUpLGFzLmludGVnZXIoZGVza3J5cHRvcnk2NTUkRFpfRFpJQUxfSUQpW2ldLE5BKSwNCiAgICAgICAgICAgICBEWl9OQVpXQSA9IGlmZWxzZShncmVwbChkZXNrcnlwdG9yeTY1NSRYNjU1W2ldLFg2NTUpLGFzLmNoYXJhY3RlcihkZXNrcnlwdG9yeTY1NSREWl9OQVpXQSlbaV0sTkEpKSAlPiUNCiAgICAgIGZpbHRlcighaXMubmEocmVkYWt0b3JfZHppYWx1KSkNCiAgICBpZiAobGVuZ3RoKGRvX3ByemVkbWlvdG93ZWoyJHJlZGFrdG9yX2R6aWFsdSk+MCkgew0KICAgICAgdGVzdCA8LSByYmluZCh0ZXN0LGRvX3ByemVkbWlvdG93ZWoyKQ0KICAgIH0gZWxzZSB7fQ0KICAgIA0KfQ0KY291bnQgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZSh0ZXN0JFpBX1VXQUdJKSkNCmRvX3ByemVkbWlvdG93ZWoyIDwtIG1lcmdlKHRlc3QsY291bnQsIGJ5LnggPSAiWkFfVVdBR0kiLGJ5LnkgPSAiVmFyMSIpICU+JQ0KICBtdXRhdGUoZGx1Z29zYyA9IG5jaGFyKGNvKSkgJT4lDQogIGFycmFuZ2UoLUZyZXEsWkFfVVdBR0ksLWRsdWdvc2MsLWlsZSkNCg0KZG9fcHJ6ZWRtaW90b3dlajIkaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKGRvX3ByemVkbWlvdG93ZWoyWzFdKSkNCmRvX3ByemVkbWlvdG93ZWoyIDwtIGRvX3ByemVkbWlvdG93ZWoyWyFkdXBsaWNhdGVkKGRvX3ByemVkbWlvdG93ZWoyJGlkX2dydXB5KSxdICU+JQ0KICBtdXRhdGUoVFdfVFdPUkNBX0lEID0gTkEsDQogICAgICAgICBUV19OQVpXSVNLTyA9IE5BLA0KICAgICAgICAgVFdfSU1JRSA9IE5BLA0KICAgICAgICAgUlpfUk9EWkFKX0lEID0gMjEsDQogICAgICAgICBSWl9OQVpXQSA9ICJrc2nEhcW8a2EgdyBoYcWbbGUgcnplY3pvd3ltIikgJT4lDQogIHNlbGVjdChuYW1lcyhkb19wcnplZG1pb3Rvd2VqMSkpDQojcHJ6eXBpc2FuaWUgbmEgcG9kc3Rhd2llIGN6xJlzdG90bGl3b8WbY2kgZGVza3J5cHRvcsOzdyA2NTANCnByemVkbWlvdG93YV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwcnplZG1pb3Rvd2EiKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fcHJ6ZWRtaW90b3dlajEkWkFfVVdBR0kpICU+JQ0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb19wcnplZG1pb3Rvd2VqMiRaQV9VV0FHSSkNCg0KZGVza3J5cHRvcnk2NTAgPC0gcG9wcnplZG5pZV9pbXBvcnR5ICU+JQ0KICBzZWxlY3QoWDY1MCxwcmFjb3duaWtfcGJsLERaX0RaSUFMX0lELERaX05BWldBKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShYNjUwKSkgJT4lDQogIHVuaXRlKGRhdGE9Lixjb2wgPSAiZGVza3J5cHRvcjY1MCIsIHNlcCA9ICJ+IikNCg0KZGVza3J5cHRvcnk2NTAgPC0gYXMuZGF0YS5mcmFtZSh0YWJsZShkZXNrcnlwdG9yeTY1MCRkZXNrcnlwdG9yNjUwKSkgJT4lDQogIGNTcGxpdCguLCJWYXIxIixzZXAgPSAifiIsZGlyZWN0aW9uID0gIndpZGUiKSAlPiUNCiAgcmVuYW1lKFg2NTAgPSBWYXIxXzEsDQogICAgICAgICByZWRha3Rvcl9kemlhbHUgPSBWYXIxXzIsDQogICAgICAgICBEWl9EWklBTF9JRCA9IFZhcjFfMywNCiAgICAgICAgIERaX05BWldBID0gVmFyMV80KSAlPiUNCiAgbXV0YXRlKFg2NTAgPSBzdHJfcmVtb3ZlX2FsbChYNjUwLCJcXFxcN1xcJGEiKSwNCiAgICAgICAgIFg2NTAgPSBzdHJfcmVtb3ZlX2FsbChYNjUwLCJcXCQyREJOIiksDQogICAgICAgICBYNjUwID0gc3RyX3JlbW92ZV9hbGwoWDY1MCwiXFxcXFxcXFwiKSwNCiAgICAgICAgIFg2NTAgPSBzdHJfcmVwbGFjZV9hbGwoWDY1MCwiXFwkLnxcXHwiLCIgIiksDQogICAgICAgICBYNjUwID0gc3RyX3JlcGxhY2VfYWxsKFg2NTAsIiAiLCIuKiIpLA0KICAgICAgICAgWDY1MCA9IHN0cl9yZXBsYWNlX2FsbChYNjUwLCAiW15cXHB7TH1cXGRcXCpcXC5cXC1cXHNdIiwgIiIpKSAlPiUNCiAgYXJyYW5nZShYNjUwLC1GcmVxLERaX05BWldBKQ0KDQpkZXNrcnlwdG9yeTY1MCRpZF9ncnVweSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQoZGVza3J5cHRvcnk2NTBbMl0pKQ0KZGVza3J5cHRvcnk2NTAgPC0gZGVza3J5cHRvcnk2NTBbIWR1cGxpY2F0ZWQoZGVza3J5cHRvcnk2NTAkaWRfZ3J1cHkpLF0gJT4lDQogIHNlbGVjdCgtaWRfZ3J1cHkpICU+JQ0KICBhcnJhbmdlKC1GcmVxKQ0KDQp4IDwtIDE6bGVuZ3RoKGRlc2tyeXB0b3J5NjUwJFg2NTApDQp0ZXN0IDwtIGRhdGEuZnJhbWUoc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICAgIGRvX3ByemVkbWlvdG93ZWozIDwtIHByemVkbWlvdG93YV9yZWRha3Rvcnp5ICU+JQ0KICAgICAgbXV0YXRlKHJlZGFrdG9yX2R6aWFsdSA9IGlmZWxzZShncmVwbChkZXNrcnlwdG9yeTY1MCRYNjUwW2ldLFg2NTApLGFzLmNoYXJhY3RlcihkZXNrcnlwdG9yeTY1MCRyZWRha3Rvcl9kemlhbHUpW2ldLE5BKSwNCiAgICAgICAgICAgICBpbGUgPSBpZmVsc2UoZ3JlcGwoZGVza3J5cHRvcnk2NTAkWDY1MFtpXSxYNjUwKSxhcy5pbnRlZ2VyKGRlc2tyeXB0b3J5NjUwJEZyZXEpW2ldLE5BKSwNCiAgICAgICAgICAgICBjbyA9IGlmZWxzZShncmVwbChkZXNrcnlwdG9yeTY1MCRYNjUwW2ldLFg2NTApLGFzLmNoYXJhY3RlcihkZXNrcnlwdG9yeTY1MCRYNjUwKVtpXSxOQSksDQogICAgICAgICAgICAgRFpfRFpJQUxfSUQgPSBpZmVsc2UoZ3JlcGwoZGVza3J5cHRvcnk2NTAkWDY1MFtpXSxYNjUwKSxhcy5pbnRlZ2VyKGRlc2tyeXB0b3J5NjUwJERaX0RaSUFMX0lEKVtpXSxOQSksDQogICAgICAgICAgICAgRFpfTkFaV0EgPSBpZmVsc2UoZ3JlcGwoZGVza3J5cHRvcnk2NTAkWDY1MFtpXSxYNjUwKSxhcy5jaGFyYWN0ZXIoZGVza3J5cHRvcnk2NTAkRFpfTkFaV0EpW2ldLE5BKSkgJT4lDQogICAgICBmaWx0ZXIoIWlzLm5hKHJlZGFrdG9yX2R6aWFsdSkpDQogICAgaWYgKGxlbmd0aChkb19wcnplZG1pb3Rvd2VqMyRyZWRha3Rvcl9kemlhbHUpPjApIHsNCiAgICAgIHRlc3QgPC0gcmJpbmQodGVzdCxkb19wcnplZG1pb3Rvd2VqMykNCiAgICB9IGVsc2Uge30NCiAgICANCn0NCmNvdW50IDwtIGFzLmRhdGEuZnJhbWUodGFibGUodGVzdCRaQV9VV0FHSSkpDQpkb19wcnplZG1pb3Rvd2VqMyA8LSBtZXJnZSh0ZXN0LGNvdW50LCBieS54ID0gIlpBX1VXQUdJIixieS55ID0gIlZhcjEiKSAlPiUNCiAgbXV0YXRlKGRsdWdvc2MgPSBuY2hhcihjbykpICU+JQ0KICBhcnJhbmdlKC1GcmVxLFpBX1VXQUdJLC1kbHVnb3NjLC1pbGUpDQoNCmRvX3ByemVkbWlvdG93ZWozJGlkX2dydXB5IDwtIGN1bXN1bSghZHVwbGljYXRlZChkb19wcnplZG1pb3Rvd2VqM1sxXSkpDQpkb19wcnplZG1pb3Rvd2VqMyA8LSBkb19wcnplZG1pb3Rvd2VqM1shZHVwbGljYXRlZChkb19wcnplZG1pb3Rvd2VqMyRpZF9ncnVweSksXSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BLA0KICAgICAgICAgVFdfTkFaV0lTS08gPSBOQSwNCiAgICAgICAgIFRXX0lNSUUgPSBOQSwNCiAgICAgICAgIFJaX1JPRFpBSl9JRCA9IDIxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHcgaGHFm2xlIHJ6ZWN6b3d5bSIpICU+JQ0KICBzZWxlY3QobmFtZXMoZG9fcHJ6ZWRtaW90b3dlajEpKQ0KDQpkb19wcnplZG1pb3Rvd2VqIDwtIHJiaW5kKGRvX3ByemVkbWlvdG93ZWoxLGRvX3ByemVkbWlvdG93ZWoyLGRvX3ByemVkbWlvdG93ZWozKQ0KI3ByenlwaXNhbmllIHByemVkbWlvdG93ZWogbmEgcG9kc3Rhd2llIHPFgm93bmlrYSBwb2rEmcSHDQpkb19wcnplZG1pb3Rvd2VqIDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwcnplZG1pb3Rvd2EiKSAlPiUNCiAgbGVmdF9qb2luKC4sZG9fcHJ6ZWRtaW90b3dlaixieT0iWkFfVVdBR0kiKSAlPiUNCiNwcnp5cGlzYW5pZSBuYSBwb2RzdGF3aWUgemRlZmluaW93YW55Y2ggc8WCw7N3IChkb3Bpc2FuaWUgZG8gZ290b3dlZ28gcGxpa3UpDQogIG11dGF0ZShyZWRha3Rvcl9kemlhbHUgPSBpZmVsc2UoaXMubmEocmVkYWt0b3JfZHppYWx1KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoInRlYXRyIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoInRlYXRyIixYNjUwLGlnbm9yZS5jYXNlID0gVFJVRSksIk1BUlRBSyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiZmlsbSIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJmaWxtIixYNjUwLGlnbm9yZS5jYXNlID0gVFJVRSksIk9MQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJ0ZWxld2l6aiIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJ0ZWxld2l6aiIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpLCJFV0EiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoInJhZGlvIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoInJhZGlvIixYNjUwLGlnbm9yZS5jYXNlID0gVFJVRSksIkVXQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoImN6YXNvcGlzbSIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJjemFzb3Bpc20iLFg2NTAsaWdub3JlLmNhc2UgPSBUUlVFKSwiVE9NQVNaIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoInd5ZGF3bmljdHciLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgid3lkYXduaWN0dyIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpLCJCQVJCQVJBVyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgib2QgMTk4OSIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJvZCAxOTg5IixYNjUwLGlnbm9yZS5jYXNlID0gVFJVRSksIlBBVUxJTkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCLEh3dpY3plfHphZGFufHN6a2/FgnxzemvDs8WCfHNjZW5hcml1c3ogemFqxJnEh3xzY2VuYXJpdXN6ZSB6YWrEmcSHfHphasSZxId8cG9tb2NuaWN6fHBvZHLEmWN6bmlrIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoIsSHd2ljemV8emFkYW58c3prb8WCfHN6a8OzxYJ8c2NlbmFyaXVzeiB6YWrEmcSHfHNjZW5hcml1c3plIHphasSZxId8emFqxJnEh3xwb21vY25pY3p8cG9kcsSZY3puaWsiLFg2NTAsaWdub3JlLmNhc2UgPSBUUlVFKSwiS0FST0xJTkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgic2Nlbmljem4iLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgic2Nlbmljem4iLFg2NTAsaWdub3JlLmNhc2UgPSBUUlVFKSwiTUFSVEFLIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJ0ZW9yaWF8c29jam9sb2dpYXxhbnRyb3BvbG9naWF8bWV0YWZpenlrfGludGVycHJldGFjfGZpbG96b2YiLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgidGVvcmlhfHNvY2pvbG9naWF8YW50cm9wb2xvZ2lhfG1ldGFmaXp5a3xpbnRlcnByZXRhY3xmaWxvem9mIixYNjUwLGlnbm9yZS5jYXNlID0gVFJVRSksIlBBVUxJTkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJsdWRvd3x6d3ljenxvYnljenxmb2xrbCIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJsdWRvd3x6d3ljenxvYnljenxmb2xrbCIsWDY1MCxpZ25vcmUuY2FzZSA9IFRSVUUpLCJBTklBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoImthdG9saWN8YmlibGlhfGJpYmxpanxrb8WbY2nDs8WCIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoImthdG9saWN8YmlibGlhfGJpYmxpanxrb8WbY2nDs8WCIixYNjUwLGlnbm9yZS5jYXNlID0gVFJVRSksIkJFQVRBUyIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiZHJ1a3xyxJlrb3BpfGlua3VuYWJ8aW53ZW50fGJpYmxpb2dyfHPFgm93bmlrfGJpYmxpb3RlayIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJkcnVrfHLEmWtvcGl8aW5rdW5hYnxpbndlbnR8YmlibGlvZ3J8c8WCb3duaWt8YmlibGlvdGVrIixYNjUwLGlnbm9yZS5jYXNlID0gVFJVRSksIklaQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoInphYmF3a3xkemllYyIsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJ6YWJhd2t8ZHppZWMiLFg2NTAsaWdub3JlLmNhc2UgPSBUUlVFKSwiQkFSQkFSQVciLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgidGVtYXR5a2F8MjAtMjEgdy58MjEgdy4iLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgidGVtYXR5a2F8MjAtMjEgdy58MjEgdy4iLFg2NTAsaWdub3JlLmNhc2UgPSBUUlVFKSwiUEFVTElOQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiMTl8MTh8MTd8MTZ8MTV8MTR8MTMiLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgiMTl8MTh8MTd8MTZ8MTV8MTR8MTMiLFg2NTAsaWdub3JlLmNhc2UgPSBUUlVFKSwiR09TSUEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJwb2xpdHlrIixYNjU1LFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKXxncmVwbCgicG9saXR5ayIsWDY1MCxYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSksIlBBVUxJTkEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiaGlzdG9yaWEiLFg2NTUsWDY1NSxpZ25vcmUuY2FzZSA9IFRSVUUpfGdyZXBsKCJoaXN0b3JpYSIsWDY1MCxYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSksIkdPU0lBIixOQSkpKSkpKSkpKSkpKSkpKSkpKSxhcy5jaGFyYWN0ZXIocmVkYWt0b3JfZHppYWx1KSksDQogICAgICAgICBSWl9ST0RaQUpfSUQgPSBpZmVsc2UoaXMubmEoUlpfUk9EWkFKX0lEKSwyMSxhcy5pbnRlZ2VyKFJaX1JPRFpBSl9JRCkpLA0KICAgICAgICAgUlpfTkFaV0EgPSBpZmVsc2UoaXMubmEoUlpfTkFaV0EpLCJrc2nEhcW8a2EgdyBoYcWbbGUgcnplY3pvd3ltIixhcy5jaGFyYWN0ZXIoUlpfTkFaV0EpKSkgJT4lDQogIHNlbGVjdChuYW1lcyhkb19wcnplZG1pb3Rvd2VqMSkpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKHJlZGFrdG9yX2R6aWFsdSkpDQojd3lkb2J5Y2llIHpiaW9ydSwga3TDs3J5IGNpxIVnbGUgbmllIG1hIHByenlwaXNhbnljaCByZWRha3RvcsOzdyBkbyBwcnplZG1pb3Rvd2VqDQpwcnplZG1pb3Rvd2FfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0icHJ6ZWRtaW90b3dhIikgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3ByemVkbWlvdG93ZWokWkFfVVdBR0kpDQojZGxhIGtzacSFxbxlaywga3TDs3JlIG1hasSFIGtpbGt1IGF1dG9yw7N3IHcgb3NvYmFfYm5fdGVtYXQgLSBwcnp5cGlzYW5pZSBkbyByZWRha3RvcmEgcG93c3plY2huZWogLSBCRUFUQUQ/DQpkb19wcnplZG1pb3Rvd2VqNCA8LSBwcnplZG1pb3Rvd2FfcmVkYWt0b3J6eSAlPiUNCiAgZmlsdGVyKCFpcy5uYShvc29iYV9ibl90ZW1hdCkpICU+JQ0KICBtdXRhdGUoVFdfVFdPUkNBX0lEID0gTkEsDQogICAgICAgICBUV19OQVpXSVNLTyA9IE5BLA0KICAgICAgICAgVFdfSU1JRSA9IE5BLA0KICAgICAgICAgRFpfRFpJQUxfSUQgPSBOQSwNCiAgICAgICAgIERaX05BWldBID0gTkEsDQogICAgICAgICBSWl9ST0RaQUpfSUQgPSAyMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB3IGhhxZtsZSByemVjem93eW0iLA0KICAgICAgICAgcmVkYWt0b3JfZHppYWx1ID0gIkJFQVRBRCIpICU+JQ0KICBzZWxlY3QobmFtZXMoZG9fcHJ6ZWRtaW90b3dlajEpKQ0KI2RsYSBrc2nEhcW8ZWssIGt0w7NyZSBuaWUgbWFqxIUgd3lwZcWCbmlvbmVnbyBvc29iYV9ibl9hdXRvciAtIHByenlwaXNhbmllIGRvIE1hcnR5IHogeD8gY3p5IGxvc293byBkbyBrb2dvxZs/DQpkb19wcnplZG1pb3Rvd2VqNSA8LSBwcnplZG1pb3Rvd2FfcmVkYWt0b3J6eSAlPiUNCiAgZmlsdGVyKGlzLm5hKG9zb2JhX2JuX2F1dG9yKSkgJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSwNCiAgICAgICAgIFRXX05BWldJU0tPID0gTkEsDQogICAgICAgICBUV19JTUlFID0gTkEsDQogICAgICAgICBEWl9EWklBTF9JRCA9IE5BLA0KICAgICAgICAgRFpfTkFaV0EgPSBOQSwNCiAgICAgICAgIFJaX1JPRFpBSl9JRCA9IDIxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHcgaGHFm2xlIHJ6ZWN6b3d5bSIsDQogICAgICAgICByZWRha3Rvcl9kemlhbHUgPSAiTUFSVEFLeCIpICU+JQ0KICBzZWxlY3QobmFtZXMoZG9fcHJ6ZWRtaW90b3dlajEpKQ0KI3BvxYJhY3plbmllIHdzenlzdGtpY2ggcHJ6ZWRtaW90b3d5Y2ggeiBwcnp5cGlzYW55bWkgcmVkYWt0b3JhbWkgdyBqZWRlbiBwbGlrDQpkb19wcnplZG1pb3Rvd2VqIDwtIHJiaW5kKGRvX3ByemVkbWlvdG93ZWosZG9fcHJ6ZWRtaW90b3dlajQsZG9fcHJ6ZWRtaW90b3dlajUpDQojZGxhIGtzacSFxbxlaywga3TDs3JlIG1hasSFIHd5cGXFgm5pb25lIG9zb2JhX2JuX2F1dG9yIC0gem1pYW5hIG5hIHBvZG1pb3Rvd8SFIGRvIHLEmWN6bmVnbyBwcnplanJ6ZW5pYSBpIHByenlwaXNhbmllIHJlZGFrdG9yw7N3DQojIyNwcnp5cGlzYW5pZSBkbyBwb2RtaW90b3dlaiEhISEhISEhISEhISEhISEhISEjIyMjIyMjIyMjIyMjIyMNCmRvX3BvZG1pb3Rvd2VqMSA8LSBwcnplZG1pb3Rvd2FfcmVkYWt0b3J6eSAlPiUNCiAgZmlsdGVyKCFpcy5uYShvc29iYV9ibl9hdXRvcikpDQojdHJ6ZWJhIHpha3R1YWxpem93YcSHIHcgYm5fb2ssIMW8ZSB0ZXJheiB0byBzxIUgcG9kbWlvdG93ZQ0KI2xpc3RhIHJla29yZMOzdyBkbyBwcnplcGlzYW5pYSB6IHByemVkbWlvdG93ZWogbmEgcG9kbWlvdG93xIUNCmxpc3RhX2RvX3ByemVwaXNhbmlhIDwtIGRvX3BvZG1pb3Rvd2VqMSRaQV9VV0FHSQ0KYm5fb2skcm9kemFqX2tzaWF6a2lbYm5fb2skWkFfVVdBR0kgJWluJSBsaXN0YV9kb19wcnplcGlzYW5pYV0gPC0gInBvZG1pb3Rvd2EiDQojdG8sIGNvIGJ5xYJvIHBvZG1pb3Rvd8SFIGJleiBhdXRvcmEgcG93aW5ubyB0cmFmacSHIGRvIGxpdGVyYXR1cnkgYW5vbmltb3dlaiB6IHByYWNvd25pa2llbSBwcnplZG0sIHdpxJljIHRlcmF6IHRyemViYSB0byBwcnplcGlzYcSHIGRvIHByemVkbWlvdG93ZWogLSBuYSBrb8WEY3UgcHJvY2VzdQ0KcG9kbWlvdG93YV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwb2RtaW90b3dhIiZYMTAwPT0iIikNCiNwcnp5cGlzYW5pZSBsaXRlcmF0dXJ5IGFub25pbW93ZWoNCiM2NTUNCm1hcmNfZmllbGRfNjU1IDwtIHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg2NTUpJT4lDQogIGZpbHRlcihYNjU1IT0iIikgJT4lDQogIG11dGF0ZShYNjU1PXN0cl9yZXBsYWNlX2FsbChYNjU1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg2NTUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDY1NSE9IiIpICU+JQ0KICBtdXRhdGUoWDY1NT1zdHJfcmVtb3ZlX2FsbChYNjU1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg2NTUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwocG9kbWlvdG93YV9yZWRha3Rvcnp5JFg2NTUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF82NTUpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNjU1PC1jYmluZChtYXJjX2ZpZWxkXzY1NSxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzY1NSRYNjU1IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNjU1JFg2NTUsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNjU1WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNjU1JFg2NTUpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzY1NSRYNjU1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCm1hcmNfZmllbGRfNjU1IDwtIG1hcmNfZmllbGRfNjU1ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRhYCkgJT4lDQogIHVuaXF1ZSgpDQp0cmltIDwtIGZ1bmN0aW9uICh4KSBnc3ViKCJeXFxzK3xcXHMrJCIsICIiLCB4KQ0KUEJMX2xpdGVyYXR1cnlfYW5vbmltb3dlIDwtIFBCTF9kemlhbHlfcGF0aCAlPiUNCiAgZmlsdGVyKGdyZXBsKCJVdHdvcnkgYW5vbmltIixEWl9OQVpXQSkpICU+JQ0KICBzZWxlY3QoRFpfRFpJQUxfSUQsRFpfTkFaV0EsTkFEX05BRF9EWl9EWklBTF9JRCkgJT4lDQogIGxlZnRfam9pbiguLHJlZGFrdG9yenlfZHppYWxvdyxieSA9IGMoIk5BRF9OQURfRFpfRFpJQUxfSUQiPSJEWl9EWklBTF9JRCIpKSAlPiUNCiAgc2VsZWN0KDEsRFpfTkFaV0EgPSAyLDUpICU+JQ0KICBmaWx0ZXIoRFpfRFpJQUxfSUQgJW5vdGluJSBjKDE5MjIsMTk4MykpICU+JQ0KICBncm91cF9ieShEWl9EWklBTF9JRCkgJT4lDQogIG11dGF0ZShuYXp3YSA9IHBhc3RlKHRyaW0odW5saXN0KHN0cl9leHRyYWN0X2FsbChEWl9OQVpXQSwiKD88PVxcKCkoLio/KSg/PVxcKHxcXCkpIikpKSxjb2xsYXBzZSA9ICJ8IiksDQogICAgICAgICBuYXp3YSA9IHN0cl9yZW1vdmVfYWxsKG5hendhLCIoLikoPz1cXHx8JCkiKSwNCiAgICAgICAgIG5hendhID0gc3RyX3JlbW92ZShuYXp3YSwibGl0ZXJhdHVyLiAiKSwNCiAgICAgICAgIG5hendhID0gaWZlbHNlKG5hendhPT0iIiwicG9sc2siLGFzLmNoYXJhY3RlcihuYXp3YSkpLA0KICAgICAgICAgcmVkYWt0b3JfZHppYWx1ID0gaWZlbHNlKGlzLm5hKHJlZGFrdG9yX2R6aWFsdSksIkFOSUEiLGFzLmNoYXJhY3RlcihyZWRha3Rvcl9kemlhbHUpKSkgJT4lDQogIHVuZ3JvdXAoKQ0KDQpyZWN6bmUgPC0gZGF0YS5mcmFtZShEWl9EWklBTF9JRCA9IGMoODk5LDY5NCw2OTQsMTE3NCwxNDUsMTIyMCksRFpfTkFaV0EgPSBjKCJVdHdvcnkgYW5vbmltb3dlIChJbmRpaSkiLCJVdHdvcnkgYW5vbmltb3dlIChicnl0eWpza2EgaSBpcmxhbmR6a2EpIiwiVXR3b3J5IGFub25pbW93ZSAoYnJ5dHlqc2thIGkgaXJsYW5kemthKSIsIlV0d29yeSBhbm9uaW1vd2UgKHN0YXJvc8WCb3dpYcWEc2thKSIsIlV0d29yeSBhbm9uaW1vd2UgaSB1bG90bmUiLCJVdHdvcnkgYW5vbmltb3dlICh0dXJlY2thKSIpLCByZWRha3Rvcl9kemlhbHUgPSBjKCJFV0EiLCJCRUFUQUsiLCJCRUFUQUsiLCJCRUFUQUQiLCJBTklBIiwiRVdBIiksIG5hendhID0gYygiaW5keWpzayIsIndhbGlqc2siLCJhbmdpZWxzayIsInN0YXJvcnVzayIsImthc3p1YnNrIiwibm9nYWpzayIpKQ0KDQpQQkxfbGl0ZXJhdHVyeV9hbm9uaW1vd2UgPC0gcmJpbmQoUEJMX2xpdGVyYXR1cnlfYW5vbmltb3dlLHJlY3puZSkNCg0KbWFyY19maWVsZF82NTUgPC0gc3FsZGYoInNlbGVjdCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBtYXJjX2ZpZWxkXzY1NSBhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBqb2luIFBCTF9saXRlcmF0dXJ5X2Fub25pbW93ZSBiIG9uIGEuYCRhYCBsaWtlICgnJSd8fGIubmF6d2F8fCclJykiKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSxEWl9EWklBTF9JRCkNCg0KbWFyY19maWVsZF82NTUkc2FtZSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQobWFyY19maWVsZF82NTVbMV0pKQ0KbWFyY19maWVsZF82NTUgPC0gbWFyY19maWVsZF82NTVbIWR1cGxpY2F0ZWQobWFyY19maWVsZF82NTUkc2FtZSksXSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLERaX0RaSUFMX0lELERaX05BWldBLHJlZGFrdG9yX2R6aWFsdSkgJT4lDQogIGZpbHRlcighaXMubmEoRFpfRFpJQUxfSUQpKSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BLA0KICAgICAgICAgVFdfTkFaV0lTS08gPSBOQSwNCiAgICAgICAgIFRXX0lNSUUgPSBOQSwNCiAgICAgICAgIFJaX1JPRFpBSl9JRCA9IDIxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHcgaGHFm2xlIHJ6ZWN6b3d5bSIpICU+JQ0KICBzZWxlY3QobmFtZXMobWFyY19maWVsZF82MDApKQ0KIyMjcHJ6eXBpc2FuaWUgZG8gcmVkYWt0b3LDs3cgbGl0ZXJhdHVyeSBhbm9uaW1vd2VqIG5hIHBvZHN0YXdpZSBsaXRlcmF0dXJ5IHogcG9sYSA2NTANCnBvZG1pb3Rvd2FfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0icG9kbWlvdG93YSImWDEwMD09IiIpICU+JQ0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBtYXJjX2ZpZWxkXzY1NSRaQV9VV0FHSSkNCg0KIzY1MA0KbWFyY19maWVsZF82NTAgPC0gcG9kbWlvdG93YV9yZWRha3Rvcnp5ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDY1MCklPiUNCiAgZmlsdGVyKFg2NTAhPSIiKSAlPiUNCiAgbXV0YXRlKFg2NTA9c3RyX3JlcGxhY2VfYWxsKFg2NTAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDY1MCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNjUwIT0iIikgJT4lDQogIG11dGF0ZShYNjUwPXN0cl9yZW1vdmVfYWxsKFg2NTAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDY1MCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChwb2RtaW90b3dhX3JlZGFrdG9yenkkWDY1MCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzY1MClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF82NTA8LWNiaW5kKG1hcmNfZmllbGRfNjUwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNjUwJFg2NTAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF82NTAkWDY1MCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF82NTBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF82NTAkWDY1MCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNjUwJFg2NTApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KbWFyY19maWVsZF82NTAgPC0gbWFyY19maWVsZF82NTAgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgKSAlPiUNCiAgdW5pcXVlKCkNCg0KbWFyY19maWVsZF82NTAgPC0gc3FsZGYoInNlbGVjdCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBtYXJjX2ZpZWxkXzY1MCBhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBqb2luIFBCTF9saXRlcmF0dXJ5X2Fub25pbW93ZSBiIG9uIGEuYCRhYCBsaWtlICgnJSd8fGIubmF6d2F8fCclJykiKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSxEWl9EWklBTF9JRCkNCg0KbWFyY19maWVsZF82NTAkc2FtZSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQobWFyY19maWVsZF82NTBbMV0pKQ0KbWFyY19maWVsZF82NTAgPC0gbWFyY19maWVsZF82NTBbIWR1cGxpY2F0ZWQobWFyY19maWVsZF82NTAkc2FtZSksXSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLERaX0RaSUFMX0lELERaX05BWldBLHJlZGFrdG9yX2R6aWFsdSkgJT4lDQogIGZpbHRlcighaXMubmEoRFpfRFpJQUxfSUQpKSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BLA0KICAgICAgICAgVFdfTkFaV0lTS08gPSBOQSwNCiAgICAgICAgIFRXX0lNSUUgPSBOQSwNCiAgICAgICAgIFJaX1JPRFpBSl9JRCA9IDIxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHcgaGHFm2xlIHJ6ZWN6b3d5bSIpICU+JQ0KICBzZWxlY3QobmFtZXMobWFyY19maWVsZF82MDApKQ0KZG9fcG9kbWlvdG93ZWoxIDwtIHJiaW5kKG1hcmNfZmllbGRfNjU1LG1hcmNfZmllbGRfNjUwKQ0KDQojY28genJvYmnEhyB6IHBvem9zdGHFgnltaSBwb2RtaW90b3d5bWkgYW5vbmltb3d5bWksIGt0w7NyeWNoIG5pZSB1ZGHFgm8gc2nEmSBwcnp5cGlzYcSHPw0KcG9kbWlvdG93YV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwb2RtaW90b3dhIiZYMTAwPT0iIikgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMSRaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSwNCiAgICAgICAgIFRXX05BWldJU0tPID0gTkEsDQogICAgICAgICBUV19JTUlFID0gTkEsDQogICAgICAgICBEWl9EWklBTF9JRCA9IE5BLA0KICAgICAgICAgRFpfTkFaV0EgPSBOQSwNCiAgICAgICAgIFJaX1JPRFpBSl9JRCA9IDIxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHcgaGHFm2xlIHJ6ZWN6b3d5bSIsDQogICAgICAgICByZWRha3Rvcl9kemlhbHUgPSAiS0FST0xJTkEiKSAlPiUNCiAgc2VsZWN0KG5hbWVzKGRvX3ByemVkbWlvdG93ZWoxKSkNCmRvX3BvZG1pb3Rvd2VqMSA8LSByYmluZChkb19wb2RtaW90b3dlajEscG9kbWlvdG93YV9yZWRha3Rvcnp5KQ0KDQojbGlzdGEgcmVrb3Jkw7N3IGRvIHByemVwaXNhbmlhIHogcG9kbWlvdG93ZWogbmEgcHJ6ZWRtaW90b3fEhSAoY2hvZHppIG8gbGl0ZXJhdHVyxJkgYW5vbmltb3fEhSkNCmxpc3RhX2RvX3ByemVwaXNhbmlhIDwtIGRvX3BvZG1pb3Rvd2VqMSRaQV9VV0FHSQ0KYm5fb2skcm9kemFqX2tzaWF6a2lbYm5fb2skWkFfVVdBR0kgJWluJSBsaXN0YV9kb19wcnplcGlzYW5pYV0gPC0gInByemVkbWlvdG93YSINCg0KI3ByemV0d29yemVuaWUgY2HFgmVqIHBvZG1pb3Rvd2VqIChibyBwbGlrIGRvX3BvZG1pb3Rvd2VqMSBqdcW8IGplc3QgdyDFm3JvZGt1KQ0KIyMjcHJ6eXBpc2FuaWUgcmVkYWt0b3JhIG5hIHBvZHN0YXdpZSBvc29ieSB6IDEwMCBqYWtvIHR3w7NyY3kgKGF1dG9yYSkgKHRhYmVsYSBwYmwtYm4tdmlhZiktIGtzacSFxbxraSB0d8OzcmN5DQojMTAwDQpwb2RtaW90b3dhX3JlZGFrdG9yenkgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09InBvZG1pb3Rvd2EiKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fcG9kbWlvdG93ZWoxJFpBX1VXQUdJKQ0KDQptYXJjX2ZpZWxkXzEwMCA8LSBwb2RtaW90b3dhX3JlZGFrdG9yenkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMTAwKSU+JQ0KICBmaWx0ZXIoWDEwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDEwMD1zdHJfcmVwbGFjZV9hbGwoWDEwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMTAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgxMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgxMDA9c3RyX3JlbW92ZV9hbGwoWDEwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMTAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSRYMTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzEwMDwtY2JpbmQobWFyY19maWVsZF8xMDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8xMDAkWDEwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzEwMCRYMTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzEwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzEwMCRYMTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8xMDAkWDEwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF8xMDAgPC0gbWFyY19maWVsZF8xMDAgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgLGAkZGAsYCRjYCkgJT4lDQogIG11dGF0ZShuYW1lID0gaWZlbHNlKCFpcy5uYShgJGNgKSZzdWJzdHIoYCRjYCxuY2hhcihgJGNgKSxuY2hhcihgJGNgKSk9PSI7IixwYXN0ZShgJGFgLGAkY2AsYCRkYCxzZXAgPSAiICIpLGlmZWxzZSghaXMubmEoYCRkYCkscGFzdGUoYCRhYCxgJGRgLHNlcCA9ICIgIiksYXMuY2hhcmFjdGVyKGAkYWApKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksbmFtZSkgJT4lDQogIG11dGF0ZShuYW1lID0gc3RyX3JlcGxhY2UobmFtZSwiKFxcKSkoXFwuJCkiLCJcXDEiKSwNCiAgICAgICAgIG5hbWUgPSBzdHJfcmVwbGFjZShuYW1lLCAiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoXFwuJCkiLCJcXDEiKSkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKG5hbWUgPSBwYXN0ZShuYW1lLGNvbGxhcHNlID0gInwiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkNCg0KZG9fcG9kbWlvdG93ZWoyIDwtIG1hcmNfZmllbGRfMTAwICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgaW5uZXJfam9pbiguLHBibF92aWFmLGJ5ID0gYygibmFtZSIgPSAiQk5fbmFtZSIpKSAlPiUNCiAgaW5uZXJfam9pbiguLFBCTF90d29yY3ksYnkgPSBjKCJwYmxfaWQiPSJUV19UV09SQ0FfSUQiKSkgJT4lDQogIGxlZnRfam9pbiguLHJlZGFrdG9yenlfZHppYWxvdyxieSA9IGMoIlRXX0RaX0RaSUFMX0lEIj0iRFpfRFpJQUxfSUQiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxUV19UV09SQ0FfSUQ9cGJsX2lkLFRXX05BWldJU0tPLFRXX0lNSUUsRFpfRFpJQUxfSUQ9VFdfRFpfRFpJQUxfSUQsRFpfTkFaV0E9RFpfTkFaV0EueCxyZWRha3Rvcl9kemlhbHUpICU+JQ0KICBtdXRhdGUoUlpfUk9EWkFKX0lEID0gMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB0d8OzcmN5IChwb2RtaW90b3dhKSIpICU+JQ0KICB1bmlxdWUoKQ0KDQojIyNwcnp5cGlzYW5pZSByZWRha3RvcmEgbmEgcG9kc3Rhd2llIHpiaWXFvG5vxZtjaSBmcmF6IG5hemV3bmljdHdhIG9zb2J5IHogMTAwIHogdHfDs3JjxIUgcGJsIChkbGEgdHljaCwga3TDs3JlIG5pZSB6b3N0YcWCeSB6bWFwb3dhbmUgbmEgbGluaWkgcGJsLWJuKSAtIGtzacSFxbxraSB0d8OzcmN5DQpwb2RtaW90b3dhX3JlZGFrdG9yenkgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09InBvZG1pb3Rvd2EiKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fcG9kbWlvdG93ZWoxJFpBX1VXQUdJKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fcG9kbWlvdG93ZWoyJFpBX1VXQUdJKQ0KDQojMTAwDQptYXJjX2ZpZWxkXzEwMCA8LSBwb2RtaW90b3dhX3JlZGFrdG9yenkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMTAwKSU+JQ0KICBmaWx0ZXIoWDEwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDEwMD1zdHJfcmVwbGFjZV9hbGwoWDEwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMTAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgxMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgxMDA9c3RyX3JlbW92ZV9hbGwoWDEwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMTAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSRYMTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzEwMDwtY2JpbmQobWFyY19maWVsZF8xMDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8xMDAkWDEwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzEwMCRYMTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzEwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzEwMCRYMTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8xMDAkWDEwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQpkb19wb2RtaW90b3dlajMgPC0gbWFyY19maWVsZF8xMDAgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlbW92ZShgJGFgLCIoPzw9W2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKShcXC4kKSIpKSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoYCRhYCA9IHBhc3RlKGAkYWAsY29sbGFwc2UgPSAifCIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKFRXX05BWldJU0tPID0gaWZlbHNlKGdyZXBsKCJcXHwiLGAkYWApLCBzdHJfcmVwbGFjZV9hbGwoc3RyX3JlbW92ZV9hbGwoYCRhYCwiLCIpLCJcXHwiLCIsICIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIsIixgJGFgKSxzdHJfcmVwbGFjZV9hbGwoYCRhYCwiKC4qPykoLCApKC4qKSIsIlxcMSIpLGFzLmNoYXJhY3RlcihgJGFgKSkpLA0KICAgICAgICAgVFdfSU1JRSA9IGlmZWxzZShncmVwbCgiXFx8IixgJGFgKSwiKiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiLCIsYCRhYCksc3RyX3JlcGxhY2VfYWxsKGAkYWAsIiguKj8pKCwgKSguKikiLCJcXDMiKSwiKiIpKSwNCiAgICAgICAgIG5hendhID0gc3RyX3JlcGxhY2VfYWxsKHN0cl90b19sb3dlcihwYXN0ZShUV19OQVpXSVNLTyxUV19JTUlFLHNlcCA9ICIiKSksICJcXFciLCAiIikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksVFdfTkFaV0lTS08sVFdfSU1JRSxuYXp3YSkgJT4lIA0KICBpbm5lcl9qb2luKC4sUEJMX3R3b3JjeV9wb2RtICU+JSBzZWxlY3QoVFdfVFdPUkNBX0lELERaX0RaSUFMX0lEPVRXX0RaX0RaSUFMX0lELERaX05BWldBLG5hendhKSxieT0ibmF6d2EiKQ0KZG9fcG9kbWlvdG93ZWozJHNhbWUgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKGRvX3BvZG1pb3Rvd2VqM1sxOjRdKSkNCmRvX3BvZG1pb3Rvd2VqMyA8LSBkb19wb2RtaW90b3dlajMgJT4lIA0KICBhcnJhbmdlKFpBX1VXQUdJLFRXX05BWldJU0tPLFRXX0lNSUUsbmF6d2EsVFdfVFdPUkNBX0lEKQ0KZG9fcG9kbWlvdG93ZWozIDwtIGRvX3BvZG1pb3Rvd2VqM1shZHVwbGljYXRlZChkb19wb2RtaW90b3dlajMkc2FtZSksXSAlPiUgDQogIG11dGF0ZShEWl9EWklBTF9JRCA9IGFzLmludGVnZXIoRFpfRFpJQUxfSUQpLA0KICAgICAgICAgUlpfUk9EWkFKX0lEID0gMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB0d8OzcmN5IChwb2RtaW90b3dhKSIpICU+JSANCiAgaW5uZXJfam9pbiguLHJlZGFrdG9yenlfZHppYWxvdyAlPiUgc2VsZWN0KERaX0RaSUFMX0lELHJlZGFrdG9yX2R6aWFsdSksYnk9IkRaX0RaSUFMX0lEIikgJT4lIA0KICBzZWxlY3QobmFtZXMoZG9fcG9kbWlvdG93ZWoxKSkNCg0KIyMjcHJ6eXBpc2FuaWUgYXV0b3LDs3cgcG9kbWlvdG93ZWogZG8gbGl0ZXJhdHVyIGkgcHJ6eXBpc2FuaWUgZG8gcmVkYWt0b3LDs3cgbmEgcG9kc3Rhd2llIGtvZHUgbGl0ZXJhdHVyeSB6IHBvbGEgWDA4MCBpIHR3b3J6ZW5pZSBub3d5Y2ggdHfDs3Jjw7N3IG5hIHBvZHN0YXdpZSBwb2xhIDEwMA0KcG9kbWlvdG93YV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwb2RtaW90b3dhIikgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMSRaQV9VV0FHSSkgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMiRaQV9VV0FHSSkgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMyRaQV9VV0FHSSkNCg0KcG9kbWlvdG93YV9yZWRha3Rvcnp5IDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gcG9kbWlvdG93YV9yZWRha3Rvcnp5IGENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luIEJOX1BCTF9saXN0YV9saXRlcmF0dXIgYiBvbiBhLlgwODAgbGlrZSAoJyUnfHxiLnVrZF9vZ29sbmV8fCclJykiKQ0KDQojIyNkb2Rhd2FuaWUgbmF6ZXduaWN0dyBub3d5Y2ggdHfDs3Jjw7N3DQojMTAwDQptYXJjX2ZpZWxkXzEwMCA8LSBwb2RtaW90b3dhX3JlZGFrdG9yenkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMTAwKSU+JQ0KICBmaWx0ZXIoWDEwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDEwMD1zdHJfcmVwbGFjZV9hbGwoWDEwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMTAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgxMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgxMDA9c3RyX3JlbW92ZV9hbGwoWDEwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMTAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSRYMTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzEwMDwtY2JpbmQobWFyY19maWVsZF8xMDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8xMDAkWDEwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzEwMCRYMTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzEwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzEwMCRYMTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8xMDAkWDEwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzEwMCA8LSBtYXJjX2ZpZWxkXzEwMCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWApICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIig/PD1bYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pKFxcLiQpIikpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShgJGFgID0gcGFzdGUoYCRhYCxjb2xsYXBzZSA9ICJ8IikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUoVFdfTkFaV0lTS08gPSBpZmVsc2UoZ3JlcGwoIlxcfCIsYCRhYCksIHN0cl9yZXBsYWNlX2FsbChzdHJfcmVtb3ZlX2FsbChgJGFgLCIsIiksIlxcfCIsIiwgIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIiwiLGAkYWApLHN0cl9yZXBsYWNlX2FsbChgJGFgLCIoLio/KSgsICkoLiopIiwiXFwxIiksYXMuY2hhcmFjdGVyKGAkYWApKSksDQogICAgICAgICBUV19JTUlFID0gaWZlbHNlKGdyZXBsKCJcXHwiLGAkYWApLCIqIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIsIixgJGFgKSxzdHJfcmVwbGFjZV9hbGwoYCRhYCwiKC4qPykoLCApKC4qKSIsIlxcMyIpLCIqIikpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFRXX05BWldJU0tPLFRXX0lNSUUpDQojam9pbiBuYSBwb2RzdGF3aWUgaWRlbnR5Y3puZWdvIGlkDQpwb2RtaW90b3dhX3JlZGFrdG9yenkgPC0gcG9kbWlvdG93YV9yZWRha3Rvcnp5ICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzEwMCxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKHBibF9uYXp3YSA9IGFzLmNoYXJhY3RlcihwYmxfbmF6d2EpKSAlPiUNCiAgbXV0YXRlKERaX0RaSUFMX0lEID0gaWZlbHNlKG5hendhX3Byb3N0YT09InBvbHNrIiZzdWJzdHIocGJsX25hendhLG5jaGFyKHBibF9uYXp3YSksbmNoYXIocGJsX25hendhKSkhPXN1YnN0cihUV19OQVpXSVNLTywxLDEpLE5BLGFzLmludGVnZXIocGJsX2lkKSkpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKERaX0RaSUFMX0lEKSkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksRFpfRFpJQUxfSUQpDQoNCmNvdW50IDwtIGFzLmRhdGEuZnJhbWUodGFibGUocG9kbWlvdG93YV9yZWRha3Rvcnp5JFpBX1VXQUdJKSkNCnBvZG1pb3Rvd2FfcmVkYWt0b3J6eSA8LSBtZXJnZShwb2RtaW90b3dhX3JlZGFrdG9yenksY291bnQsYnkueCA9ICJaQV9VV0FHSSIsYnkueSA9ICJWYXIxIikgJT4lDQogIG11dGF0ZShkbHVnb3NjID0gbmNoYXIodWtkX29nb2xuZSkpICU+JQ0KICBhcnJhbmdlKC1GcmVxLFpBX1VXQUdJLC1kbHVnb3NjLHBibF9pZCkNCnBvZG1pb3Rvd2FfcmVkYWt0b3J6eSRzYW1lIDwtIGN1bXN1bSghZHVwbGljYXRlZChwb2RtaW90b3dhX3JlZGFrdG9yenlbMV0pKQ0KZG9fcG9kbWlvdG93ZWo0IDwtIHBvZG1pb3Rvd2FfcmVkYWt0b3J6eVshZHVwbGljYXRlZChwb2RtaW90b3dhX3JlZGFrdG9yenkkc2FtZSksXSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BKSAlPiUNCiAgcmVuYW1lKERaX05BWldBID0gcGJsX25hendhKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFRXX1RXT1JDQV9JRCxUV19OQVpXSVNLTyxUV19JTUlFLERaX0RaSUFMX0lELERaX05BWldBLHJlZGFrdG9yX2R6aWFsdSkgJT4lDQogIG11dGF0ZShSWl9ST0RaQUpfSUQgPSAxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHR3w7NyY3kgKHBvZG1pb3Rvd2EpIikNCg0KIyMjcHJ6eXBpc2FuaWUgYXV0b3LDs3cgcG9kbWlvdG93ZWogZG8gbGl0ZXJhdHVyIGkgcHJ6eXBpc2FuaWUgZG8gcmVkYWt0b3LDs3cgbmEgcG9kc3Rhd2llIGxpdGVyYXR1cnkgeiBwb2xhIDY1NSBpIHR3b3J6ZW5pZSBub3d5Y2ggdHfDs3Jjw7N3IG5hIHBvZHN0YXdpZSBwb2xhIDEwMA0KcG9kbWlvdG93YV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwb2RtaW90b3dhIikgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMSRaQV9VV0FHSSkgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMiRaQV9VV0FHSSkgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqMyRaQV9VV0FHSSkgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3BvZG1pb3Rvd2VqNCRaQV9VV0FHSSkNCg0KIzY1NQ0KbWFyY19maWVsZF82NTUgPC0gcG9kbWlvdG93YV9yZWRha3Rvcnp5ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDY1NSklPiUNCiAgZmlsdGVyKFg2NTUhPSIiKSAlPiUNCiAgbXV0YXRlKFg2NTU9c3RyX3JlcGxhY2VfYWxsKFg2NTUsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDY1NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNjU1IT0iIikgJT4lDQogIG11dGF0ZShYNjU1PXN0cl9yZW1vdmVfYWxsKFg2NTUsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDY1NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChwb2RtaW90b3dhX3JlZGFrdG9yenkkWDY1NSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzY1NSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF82NTU8LWNiaW5kKG1hcmNfZmllbGRfNjU1LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNjU1JFg2NTUgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF82NTUkWDY1NSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF82NTVbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF82NTUkWDY1NSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNjU1JFg2NTUpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KbWFyY19maWVsZF82NTUgPC0gbWFyY19maWVsZF82NTUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgKSAlPiUNCiAgdW5pcXVlKCkNCg0KbWFyY19maWVsZF82NTUgPC0gc3FsZGYoInNlbGVjdCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBtYXJjX2ZpZWxkXzY1NSBhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBqb2luIFBCTF9oYXNsYV9vc29ib3dlIGIgb24gYS5gJGFgIGxpa2UgKCclJ3x8Yi5uYXp3YXx8JyUnKSIpDQoNCiMjI2RvZGF3YW5pZSBuYXpld25pY3R3IG5vd3ljaCB0d8OzcmPDs3cNCiMxMDANCm1hcmNfZmllbGRfMTAwIDwtIHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgxMDApJT4lDQogIGZpbHRlcihYMTAwIT0iIikgJT4lDQogIG11dGF0ZShYMTAwPXN0cl9yZXBsYWNlX2FsbChYMTAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgxMDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDEwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDEwMD1zdHJfcmVtb3ZlX2FsbChYMTAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgxMDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwocG9kbWlvdG93YV9yZWRha3Rvcnp5JFgxMDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8xMDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMTAwPC1jYmluZChtYXJjX2ZpZWxkXzEwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzEwMCRYMTAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMTAwJFgxMDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMTAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMTAwJFgxMDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzEwMCRYMTAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCm1hcmNfZmllbGRfMTAwIDwtIG1hcmNfZmllbGRfMTAwICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRhYCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUoYCRhYCA9IHN0cl9yZW1vdmUoYCRhYCwiKD88PVthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoXFwuJCkiKSkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKGAkYWAgPSBwYXN0ZShgJGFgLGNvbGxhcHNlID0gInwiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShUV19OQVpXSVNLTyA9IGlmZWxzZShncmVwbCgiXFx8IixgJGFgKSwgc3RyX3JlcGxhY2VfYWxsKHN0cl9yZW1vdmVfYWxsKGAkYWAsIiwiKSwiXFx8IiwiLCAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiLCIsYCRhYCksc3RyX3JlcGxhY2VfYWxsKGAkYWAsIiguKj8pKCwgKSguKikiLCJcXDEiKSxhcy5jaGFyYWN0ZXIoYCRhYCkpKSwNCiAgICAgICAgIFRXX0lNSUUgPSBpZmVsc2UoZ3JlcGwoIlxcfCIsYCRhYCksIioiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIiwiLGAkYWApLHN0cl9yZXBsYWNlX2FsbChgJGFgLCIoLio/KSgsICkoLiopIiwiXFwzIiksIioiKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksVFdfTkFaV0lTS08sVFdfSU1JRSkNCiNqb2luIG5hIHBvZHN0YXdpZSBpZGVudHljem5lZ28gaWQNCm1hcmNfZmllbGRfNjU1IDwtIG1hcmNfZmllbGRfNjU1ICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzEwMCxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKERaX0RaSUFMX0lEID0gaWZlbHNlKG5hendhPT0icG9sc2siJnN1YnN0cihEWl9OQVpXQSxuY2hhcihEWl9OQVpXQSksbmNoYXIoRFpfTkFaV0EpKSE9c3Vic3RyKFRXX05BWldJU0tPLDEsMSksTkEsYXMuaW50ZWdlcihEWl9EWklBTF9JRCkpKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShEWl9EWklBTF9JRCkpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLERaX0RaSUFMX0lEKQ0KICAgIA0KbWFyY19maWVsZF82NTUkc2FtZSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQobWFyY19maWVsZF82NTVbMV0pKQ0KZG9fcG9kbWlvdG93ZWo1IDwtIG1hcmNfZmllbGRfNjU1WyFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjU1JHNhbWUpLF0gJT4lDQogIHNlbGVjdChaQV9VV0FHSSxEWl9EWklBTF9JRCxEWl9OQVpXQSxUV19OQVpXSVNLTyxUV19JTUlFLHJlZGFrdG9yX2R6aWFsdSkgJT4lDQogIGZpbHRlcighaXMubmEoRFpfRFpJQUxfSUQpKSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BLA0KICAgICAgICAgUlpfUk9EWkFKX0lEID0gMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB0d8OzcmN5IChwb2RtaW90b3dhKSIpICU+JQ0KICBzZWxlY3QobmFtZXMobWFyY19maWVsZF82MDApKQ0KDQojIyNwcnp5cGlzYW5pZSBhdXRvcsOzdyBwb2RtaW90b3dlaiBkbyBsaXRlcmF0dXIgaSBwcnp5cGlzYW5pZSBkbyByZWRha3RvcsOzdyBuYSBwb2RzdGF3aWUgbGl0ZXJhdHVyeSB6IHBvbGEgNjU1IGkgdHdvcnplbmllIG5vd3ljaCB0d8OzcmPDs3cgbmEgcG9kc3Rhd2llIHBvbGEgMTAwDQpwb2RtaW90b3dhX3JlZGFrdG9yenkgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09InBvZG1pb3Rvd2EiKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fcG9kbWlvdG93ZWoxJFpBX1VXQUdJKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fcG9kbWlvdG93ZWoyJFpBX1VXQUdJKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fcG9kbWlvdG93ZWozJFpBX1VXQUdJKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fcG9kbWlvdG93ZWo0JFpBX1VXQUdJKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fcG9kbWlvdG93ZWo1JFpBX1VXQUdJKQ0KDQojNjUwDQptYXJjX2ZpZWxkXzY1MCA8LSBwb2RtaW90b3dhX3JlZGFrdG9yenkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNjUwKSU+JQ0KICBmaWx0ZXIoWDY1MCE9IiIpICU+JQ0KICBtdXRhdGUoWDY1MD1zdHJfcmVwbGFjZV9hbGwoWDY1MCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNjUwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg2NTAhPSIiKSAlPiUNCiAgbXV0YXRlKFg2NTA9c3RyX3JlbW92ZV9hbGwoWDY1MCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNjUwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSRYNjUwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNjUwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzY1MDwtY2JpbmQobWFyY19maWVsZF82NTAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF82NTAkWDY1MCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzY1MCRYNjUwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzY1MFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzY1MCRYNjUwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF82NTAkWDY1MCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzY1MCA8LSBtYXJjX2ZpZWxkXzY1MCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWApICU+JQ0KICB1bmlxdWUoKQ0KDQptYXJjX2ZpZWxkXzY1MCA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIG1hcmNfZmllbGRfNjUwIGENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gUEJMX2hhc2xhX29zb2Jvd2UgYiBvbiBhLmAkYWAgbGlrZSAoJyUnfHxiLm5hendhfHwnJScpIikgICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzEwMCxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKERaX0RaSUFMX0lEID0gaWZlbHNlKG5hendhPT0icG9sc2siJnN1YnN0cihEWl9OQVpXQSxuY2hhcihEWl9OQVpXQSksbmNoYXIoRFpfTkFaV0EpKSE9c3Vic3RyKFRXX05BWldJU0tPLDEsMSksTkEsYXMuaW50ZWdlcihEWl9EWklBTF9JRCkpKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShEWl9EWklBTF9JRCkpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLERaX0RaSUFMX0lEKQ0KDQptYXJjX2ZpZWxkXzY1MCRzYW1lIDwtIGN1bXN1bSghZHVwbGljYXRlZChtYXJjX2ZpZWxkXzY1MFsxXSkpDQpkb19wb2RtaW90b3dlajYgPC0gbWFyY19maWVsZF82NTBbIWR1cGxpY2F0ZWQobWFyY19maWVsZF82NTAkc2FtZSksXSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLERaX0RaSUFMX0lELERaX05BWldBLFRXX05BWldJU0tPLFRXX0lNSUUscmVkYWt0b3JfZHppYWx1KSAlPiUNCiAgZmlsdGVyKCFpcy5uYShEWl9EWklBTF9JRCkpICU+JQ0KICBtdXRhdGUoVFdfVFdPUkNBX0lEID0gTkEsDQogICAgICAgICBSWl9ST0RaQUpfSUQgPSAxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHR3w7NyY3kgKHBvZG1pb3Rvd2EpIikgJT4lDQogIHNlbGVjdChuYW1lcyhtYXJjX2ZpZWxkXzYwMCkpDQojY28gem9zdGHFgm8gZG8gcG9kbWlvdG93ZWo/DQpwb2RtaW90b3dhX3JlZGFrdG9yenkgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09InBvZG1pb3Rvd2EiKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fcG9kbWlvdG93ZWoxJFpBX1VXQUdJKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fcG9kbWlvdG93ZWoyJFpBX1VXQUdJKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fcG9kbWlvdG93ZWozJFpBX1VXQUdJKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fcG9kbWlvdG93ZWo0JFpBX1VXQUdJKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fcG9kbWlvdG93ZWo1JFpBX1VXQUdJKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fcG9kbWlvdG93ZWo2JFpBX1VXQUdJKQ0KI25hZGRhdGVrIHByenlwaXNhxIcgTWFyY2llIGpha28gcG9kbWlvdG93xIUgYmV6IHR3w7NyY8OzdyBpIGN6eV9hdXRvbWF0eWN6bmllIDwtIG5pZQ0KZG9fcG9kbWlvdG93ZWo3IDwtIHBvZG1pb3Rvd2FfcmVkYWt0b3J6eSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BLA0KICAgICAgICAgVFdfTkFaV0lTS08gPSBOQSwNCiAgICAgICAgIFRXX0lNSUUgPSBOQSwNCiAgICAgICAgIERaX0RaSUFMX0lEID0gTkEsDQogICAgICAgICBEWl9OQVpXQSA9IE5BLA0KICAgICAgICAgUlpfUk9EWkFKX0lEID0gMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB0d8OzcmN5IChwb2RtaW90b3dhKSIsDQogICAgICAgICByZWRha3Rvcl9kemlhbHUgPSAiTUFSVEFLeCIpICU+JQ0KICBzZWxlY3QobmFtZXMoZG9fcG9kbWlvdG93ZWo1KSkNCiN0cnplYmEgemFrdHVhbGl6b3dhxIcgdyBibl9vaywgxbxlIHRlcmF6IHRvIG5pZSBzxIUgYXV0b21hdHljem5lDQpsaXN0YV9kb19wcnplcGlzYW5pYSA8LSBkb19wb2RtaW90b3dlajckWkFfVVdBR0kNCmJuX29rJGN6eV9hdXRvbWF0eWN6bmllW2JuX29rJFpBX1VXQUdJICVpbiUgbGlzdGFfZG9fcHJ6ZXBpc2FuaWFdIDwtICJuaWUiDQojcG/FgsSFY3plbmllIHByenlkemlhxYJ1IHBvZG1pb3Rvd3ljaCB3IGplZGVuIHBsaWsNCmRvX3BvZG1pb3Rvd2VqIDwtIHJiaW5kKGRvX3BvZG1pb3Rvd2VqMSxkb19wb2RtaW90b3dlajIsZG9fcG9kbWlvdG93ZWozLGRvX3BvZG1pb3Rvd2VqNCxkb19wb2RtaW90b3dlajUsZG9fcG9kbWlvdG93ZWo2LGRvX3BvZG1pb3Rvd2VqNykNCg0KI3ByenlwaXNhbmllIGFudG9sb2dpaSBkbyBUb21rYSBpIGRvIGxpdGVyYXR1ciBuYSBwb2RzdGF3aWUgMDgwDQphbnRvbG9naWVfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpID09ICJhbnRvbG9naWEiKQ0KUEJMX2R6aWFseV9hbnRvbG9naWUgPC0gUEJMX2R6aWFseV9wYXRoICU+JQ0KICBmaWx0ZXIoZ3JlcGwoImFudG9sb2ciLERaX05BWldBLGlnbm9yZS5jYXNlID0gVFJVRSkpICU+JQ0KICBsZWZ0X2pvaW4oLixyZWRha3Rvcnp5X2R6aWFsb3csYnk9IkRaX0RaSUFMX0lEIikgJT4lDQogIHNlbGVjdChEWl9EWklBTF9JRCxEWl9OQVpXQT1EWl9OQVpXQS54LHJlZGFrdG9yX2R6aWFsdSkgJT4lDQogIG11dGF0ZShyZWRha3Rvcl9kemlhbHUgPSBpZmVsc2UoaXMubmEocmVkYWt0b3JfZHppYWx1KSwiVE9NQVNaIixhcy5jaGFyYWN0ZXIocmVkYWt0b3JfZHppYWx1KSkpDQoNClBCTF9kemlhbHlfYW50b2xvZ2llIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gUEJMX2R6aWFseV9hbnRvbG9naWUgYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiAoc2VsZWN0IGMudWtkX29nb2xuZSxjLm5hendhX3Byb3N0YSxjLnBibF9pZCxjLnBibF9uYXp3YSxjLnBibF9pZF9saXRlcmF0dXJ5LGMucGJsX2xpdGVyYXR1cmEgZnJvbSBCTl9QQkxfbGlzdGFfbGl0ZXJhdHVyIGMpIGIgb24gYS5EWl9OQVpXQSBsaWtlICgnJSd8fGIubmF6d2FfcHJvc3RhfHwnJScpIikgJT4lDQogIG11dGF0ZSh1a2Rfb2dvbG5lID0gaWZlbHNlKERaX0RaSUFMX0lEPT0xNDYsIjgyMS4xNjIuMSIsYXMuY2hhcmFjdGVyKHVrZF9vZ29sbmUpKSwNCiAgICAgICAgIG5hendhX3Byb3N0YSA9IGlmZWxzZShEWl9EWklBTF9JRD09MTQ2LCJwb2xzayIsYXMuY2hhcmFjdGVyKG5hendhX3Byb3N0YSkpKSAlPiUNCiAgZmlsdGVyKCFpcy5uYSh1a2Rfb2dvbG5lKSkgJT4lDQogIGZpbHRlcihEWl9EWklBTF9JRCE9NzQ0KSAlPiUNCiAgc2VsZWN0KDE6NSkgDQoNCmFudG9sb2dpZV9yZWRha3Rvcnp5IDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gYW50b2xvZ2llX3JlZGFrdG9yenkgYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvaW4gUEJMX2R6aWFseV9hbnRvbG9naWUgYiBvbiBhLlgwODAgbGlrZSAoJyUnfHxiLnVrZF9vZ29sbmV8fCclJykiKQ0KDQpjb3VudCA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGFudG9sb2dpZV9yZWRha3Rvcnp5JFpBX1VXQUdJKSkNCmFudG9sb2dpZV9yZWRha3Rvcnp5IDwtIG1lcmdlKGFudG9sb2dpZV9yZWRha3Rvcnp5LGNvdW50LGJ5LnggPSAiWkFfVVdBR0kiLGJ5LnkgPSAiVmFyMSIpICU+JQ0KICBtdXRhdGUoZGx1Z29zYyA9IG5jaGFyKHVrZF9vZ29sbmUpKSAlPiUNCiAgYXJyYW5nZSgtRnJlcSxaQV9VV0FHSSwtZGx1Z29zYyxEWl9EWklBTF9JRCkNCmFudG9sb2dpZV9yZWRha3Rvcnp5JHNhbWUgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKGFudG9sb2dpZV9yZWRha3Rvcnp5WzFdKSkNCmRvX2FudG9sb2dpaTEgPC0gYW50b2xvZ2llX3JlZGFrdG9yenlbIWR1cGxpY2F0ZWQoYW50b2xvZ2llX3JlZGFrdG9yenkkc2FtZSksXSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BLA0KICAgICAgICAgVFdfTkFaV0lTS08gPSBOQSwNCiAgICAgICAgIFRXX0lNSUUgPSBOQSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxUV19UV09SQ0FfSUQsVFdfTkFaV0lTS08sVFdfSU1JRSxEWl9EWklBTF9JRCxEWl9OQVpXQSxyZWRha3Rvcl9kemlhbHUpICU+JQ0KICBtdXRhdGUoUlpfUk9EWkFKX0lEID0gMjEsDQogICAgICAgICBSWl9OQVpXQSA9ICJrc2nEhcW8a2EgdyBoYcWbbGUgcnplY3pvd3ltIikNCiNwcnp5cGlzYW5pZSBhbnRvbG9naWkgZG8gVG9ta2EgaSBkbyBsaXRlcmF0dXIgbmEgcG9kc3Rhd2llIDY2NQ0KYW50b2xvZ2llX3JlZGFrdG9yenkgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraSA9PSAiYW50b2xvZ2lhIikgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX2FudG9sb2dpaTEkWkFfVVdBR0kpDQoNCm1hcmNfZmllbGRfNjU1IDwtIGFudG9sb2dpZV9yZWRha3Rvcnp5ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDY1NSklPiUNCiAgZmlsdGVyKFg2NTUhPSIiKSAlPiUNCiAgbXV0YXRlKFg2NTU9c3RyX3JlcGxhY2VfYWxsKFg2NTUsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDY1NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNjU1IT0iIikgJT4lDQogIG11dGF0ZShYNjU1PXN0cl9yZW1vdmVfYWxsKFg2NTUsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDY1NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChhbnRvbG9naWVfcmVkYWt0b3J6eSRYNjU1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNjU1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzY1NTwtY2JpbmQobWFyY19maWVsZF82NTUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF82NTUkWDY1NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzY1NSRYNjU1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzY1NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzY1NSRYNjU1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF82NTUkWDY1NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzY1NSA8LSBtYXJjX2ZpZWxkXzY1NSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWApICU+JQ0KICB1bmlxdWUoKQ0KDQptYXJjX2ZpZWxkXzY1NSA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIG1hcmNfZmllbGRfNjU1IGENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gUEJMX2R6aWFseV9hbnRvbG9naWUgYiBvbiBhLmAkYWAgbGlrZSAoJyUnfHxiLm5hendhX3Byb3N0YXx8JyUnKSIpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKERaX0RaSUFMX0lEKSkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksRFpfRFpJQUxfSUQpDQoNCm1hcmNfZmllbGRfNjU1JHNhbWUgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjU1WzFdKSkNCmRvX2FudG9sb2dpaTIgPC0gbWFyY19maWVsZF82NTVbIWR1cGxpY2F0ZWQobWFyY19maWVsZF82NTUkc2FtZSksXSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLERaX0RaSUFMX0lELERaX05BWldBLHJlZGFrdG9yX2R6aWFsdSkgJT4lDQogIGZpbHRlcighaXMubmEoRFpfRFpJQUxfSUQpKSAlPiUNCiAgbXV0YXRlKFRXX1RXT1JDQV9JRCA9IE5BLA0KICAgICAgICAgVFdfTkFaV0lTS08gPSBOQSwNCiAgICAgICAgIFRXX0lNSUUgPSBOQSwNCiAgICAgICAgIFJaX1JPRFpBSl9JRCA9IDIxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHcgaGHFm2xlIHJ6ZWN6b3d5bSIpICU+JQ0KICBzZWxlY3QobmFtZXMoZG9fYW50b2xvZ2lpMSkpDQojcHJ6eXBpc2FuaWUgYW50b2xvZ2lpIGRvIFRvbWthIGkgZG8gbGl0ZXJhdHVyIG5hIHBvZHN0YXdpZSA2NjUNCmFudG9sb2dpZV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2kgPT0gImFudG9sb2dpYSIpICU+JQ0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb19hbnRvbG9naWkxJFpBX1VXQUdJKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fYW50b2xvZ2lpMiRaQV9VV0FHSSkNCg0KbWFyY19maWVsZF82NTAgPC0gYW50b2xvZ2llX3JlZGFrdG9yenkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNjUwKSU+JQ0KICBmaWx0ZXIoWDY1MCE9IiIpICU+JQ0KICBtdXRhdGUoWDY1MD1zdHJfcmVwbGFjZV9hbGwoWDY1MCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNjUwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg2NTAhPSIiKSAlPiUNCiAgbXV0YXRlKFg2NTA9c3RyX3JlbW92ZV9hbGwoWDY1MCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNjUwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGFudG9sb2dpZV9yZWRha3Rvcnp5JFg2NTAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF82NTApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNjUwPC1jYmluZChtYXJjX2ZpZWxkXzY1MCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzY1MCRYNjUwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNjUwJFg2NTAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNjUwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNjUwJFg2NTApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzY1MCRYNjUwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCm1hcmNfZmllbGRfNjUwIDwtIG1hcmNfZmllbGRfNjUwICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRhYCkgJT4lDQogIHVuaXF1ZSgpDQoNCm1hcmNfZmllbGRfNjUwIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gbWFyY19maWVsZF82NTAgYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBQQkxfZHppYWx5X2FudG9sb2dpZSBiIG9uIGEuYCRhYCBsaWtlICgnJSd8fGIubmF6d2FfcHJvc3RhfHwnJScpIikgJT4lDQogIGZpbHRlcighaXMubmEoRFpfRFpJQUxfSUQpKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSxEWl9EWklBTF9JRCkNCg0KbWFyY19maWVsZF82NTAkc2FtZSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQobWFyY19maWVsZF82NTBbMV0pKQ0KZG9fYW50b2xvZ2lpMyA8LSBtYXJjX2ZpZWxkXzY1MFshZHVwbGljYXRlZChtYXJjX2ZpZWxkXzY1MCRzYW1lKSxdICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksRFpfRFpJQUxfSUQsRFpfTkFaV0EscmVkYWt0b3JfZHppYWx1KSAlPiUNCiAgZmlsdGVyKCFpcy5uYShEWl9EWklBTF9JRCkpICU+JQ0KICBtdXRhdGUoVFdfVFdPUkNBX0lEID0gTkEsDQogICAgICAgICBUV19OQVpXSVNLTyA9IE5BLA0KICAgICAgICAgVFdfSU1JRSA9IE5BLA0KICAgICAgICAgUlpfUk9EWkFKX0lEID0gMjEsDQogICAgICAgICBSWl9OQVpXQSA9ICJrc2nEhcW8a2EgdyBoYcWbbGUgcnplY3pvd3ltIikgJT4lDQogIHNlbGVjdChuYW1lcyhkb19hbnRvbG9naWkxKSkNCiNyZXN6dGEgYW50b2xvZ2lpIGJleiBkemlhxYJ1IHBvIHByb3N0dSBwcnp5cGlzYW5hIGRvIFRvbWthDQphbnRvbG9naWVfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpID09ICJhbnRvbG9naWEiKSAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fYW50b2xvZ2lpMSRaQV9VV0FHSSkgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX2FudG9sb2dpaTIkWkFfVVdBR0kpICU+JQ0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb19hbnRvbG9naWkzJFpBX1VXQUdJKQ0KDQpkb19hbnRvbG9naWk0IDwtIGFudG9sb2dpZV9yZWRha3Rvcnp5ICU+JQ0KICBtdXRhdGUoVFdfVFdPUkNBX0lEID0gTkEsDQogICAgICAgICBUV19OQVpXSVNLTyA9IE5BLA0KICAgICAgICAgVFdfSU1JRSA9IE5BLA0KICAgICAgICAgRFpfRFpJQUxfSUQgPSBOQSwNCiAgICAgICAgIERaX05BWldBID0gTkEsDQogICAgICAgICBSWl9ST0RaQUpfSUQgPSAyMSwNCiAgICAgICAgIFJaX05BWldBID0gImtzacSFxbxrYSB3IGhhxZtsZSByemVjem93eW0iLA0KICAgICAgICAgcmVkYWt0b3JfZHppYWx1ID0gIlRPTUFTWiIpICU+JQ0KICBzZWxlY3QobmFtZXMoZG9fYW50b2xvZ2lpMSkpDQoNCmRvX2FudG9sb2dpaSA8LSByYmluZChkb19hbnRvbG9naWkxLGRvX2FudG9sb2dpaTIsZG9fYW50b2xvZ2lpMyxkb19hbnRvbG9naWk0KQ0KIyMjcHJ6eXBpc2FuaWUgcmVkYWt0b3JhIGRvIHdzcMOzxYJ3eWRhxYQgbmEgcG9kc3Rhd2llIG9zb2J5IHogMjQ1IGpha28gdHfDs3JjeSAoYXV0b3JhKSAodGFiZWxhIHBibC1ibi12aWFmKS0ga3NpxIXFvGtpIHR3w7NyY3kNCndzcG9sd3lkYW5pZV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJ3c3DDs8WCd3lkYW5pZSIpDQoNCmRvX3dzcG9sd3lkYW5pYTEgPC0gd3Nwb2x3eWRhbmllX3JlZGFrdG9yenkgJT4lIA0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NSkgJT4lIA0KICBtdXRhdGUoWDI0NSA9IHN0cl9leHRyYWN0KFgyNDUsICIoPzw9XFwvXFwkYykoLio/KSg/PSA7fCQpIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCJcXC4kIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCJcXFsiKSwNCiAgICAgICAgIFgyNDUgPSBzdHJfcmVtb3ZlKFgyNDUsIlxcXSIpLA0KICAgICAgICAgbmF6d2lza28gPSBpZmVsc2UoZ3JlcGwoIiBbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvlxcLl0qICIsWDI0NSksYXMuY2hhcmFjdGVyKFgyNDUpLHN0cl9yZXBsYWNlKFgyNDUsIiheLio/KSggKSg/IS4qICkoLiokKSIsIlxcMyIpKSwNCiAgICAgICAgIGltaWUgPSBpZmVsc2UoZ3JlcGwoIiBbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvlxcLl0qICIsWDI0NSksIioiLHN0cl9yZXBsYWNlKFgyNDUsIiheLio/KSggKSg/IS4qICkoLiokKSIsIlxcMSIpKSwNCiAgICAgICAgIG5hbWUgPSBwYXN0ZShuYXp3aXNrbyxpbWllLHNlcCA9ICIsICIpKSAlPiUNCiAgaW5uZXJfam9pbiguLHBibF92aWFmLGJ5ID0gYygibmFtZSIgPSAiQk5fbmFtZSIpKSAlPiUNCiAgbGVmdF9qb2luKC4sUEJMX3R3b3JjeSxieSA9IGMoInBibF9pZCI9IlRXX1RXT1JDQV9JRCIpKSAlPiUNCiAgbGVmdF9qb2luKC4scmVkYWt0b3J6eV9kemlhbG93LGJ5ID0gYygiVFdfRFpfRFpJQUxfSUQiPSJEWl9EWklBTF9JRCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFRXX1RXT1JDQV9JRD1wYmxfaWQsVFdfTkFaV0lTS08sVFdfSU1JRSxEWl9EWklBTF9JRD1UV19EWl9EWklBTF9JRCxEWl9OQVpXQT1EWl9OQVpXQS54LHJlZGFrdG9yX2R6aWFsdSkgJT4lDQogIG11dGF0ZShSWl9ST0RaQUpfSUQgPSAxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHR3w7NyY3kgKHBvZG1pb3Rvd2EpIikgJT4lDQogIHVuaXF1ZSgpDQojIyNwcnp5cGlzYW5pZSByZWRha3RvcmEgbmEgcG9kc3Rhd2llIHpiaWXFvG5vxZtjaSBmcmF6IG5hemV3bmljdHdhIG9zb2J5IHogMjQ1IHogdHfDs3JjxIUgcGJsIChkbGEgdHljaCwga3TDs3JlIG5pZSB6b3N0YcWCeSB6bWFwb3dhbmUgbmEgbGluaWkgcGJsLWJuKSAtIGtzacSFxbxraSB0d8OzcmN5DQp3c3BvbHd5ZGFuaWVfcmVkYWt0b3J6eSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0id3Nww7PFgnd5ZGFuaWUiKSAlPiUgDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3dzcG9sd3lkYW5pYTEkWkFfVVdBR0kpDQoNCmRvX3dzcG9sd3lkYW5pYTIgPC0gd3Nwb2x3eWRhbmllX3JlZGFrdG9yenkgJT4lIA0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NSkgJT4lIA0KICBtdXRhdGUoWDI0NSA9IHN0cl9leHRyYWN0KFgyNDUsICIoPzw9XFwvXFwkYykoLio/KSg/PSA7fCQpIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCJcXC4kIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCJcXFsiKSwNCiAgICAgICAgIFgyNDUgPSBzdHJfcmVtb3ZlKFgyNDUsIlxcXSIpLA0KICAgICAgICAgbmF6d2lza28gPSBpZmVsc2UoZ3JlcGwoIiBbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvlxcLl0qICIsWDI0NSksYXMuY2hhcmFjdGVyKFgyNDUpLHN0cl9yZXBsYWNlKFgyNDUsIiheLio/KSggKSg/IS4qICkoLiokKSIsIlxcMyIpKSwNCiAgICAgICAgIGltaWUgPSBpZmVsc2UoZ3JlcGwoIiBbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvlxcLl0qICIsWDI0NSksIioiLHN0cl9yZXBsYWNlKFgyNDUsIiheLio/KSggKSg/IS4qICkoLiokKSIsIlxcMSIpKSwNCiAgICAgICAgIG5hbWUgPSBwYXN0ZShuYXp3aXNrbyxpbWllLHNlcCA9ICIsICIpLA0KICAgICAgICAgbmF6d2EgPSBzdHJfcmVwbGFjZV9hbGwoc3RyX3RvX2xvd2VyKG5hbWUpLCAiXFxXIiwgIiIpKSAlPiUgDQogIGlubmVyX2pvaW4oLixQQkxfdHdvcmN5X3BvZG0gJT4lIHNlbGVjdChUV19UV09SQ0FfSUQsVFdfTkFaV0lTS08sVFdfSU1JRSxEWl9EWklBTF9JRD1UV19EWl9EWklBTF9JRCxEWl9OQVpXQSxuYXp3YSksYnk9Im5hendhIikNCmRvX3dzcG9sd3lkYW5pYTIkc2FtZSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQoZG9fd3Nwb2x3eWRhbmlhMlsxOjRdKSkNCmRvX3dzcG9sd3lkYW5pYTIgPC0gZG9fd3Nwb2x3eWRhbmlhMiAlPiUgDQogIGFycmFuZ2UoWkFfVVdBR0ksbmF6d2lza28saW1pZSxuYXp3YSxUV19UV09SQ0FfSUQpDQpkb193c3BvbHd5ZGFuaWEyIDwtIGRvX3dzcG9sd3lkYW5pYTJbIWR1cGxpY2F0ZWQoZG9fd3Nwb2x3eWRhbmlhMiRzYW1lKSxdICU+JSANCiAgbXV0YXRlKERaX0RaSUFMX0lEID0gYXMuaW50ZWdlcihEWl9EWklBTF9JRCksDQogICAgICAgICBSWl9ST0RaQUpfSUQgPSAxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHR3w7NyY3kgKHBvZG1pb3Rvd2EpIikgJT4lIA0KICBpbm5lcl9qb2luKC4scmVkYWt0b3J6eV9kemlhbG93ICU+JSBzZWxlY3QoRFpfRFpJQUxfSUQscmVkYWt0b3JfZHppYWx1KSxieT0iRFpfRFpJQUxfSUQiKSAlPiUgDQogIHNlbGVjdChuYW1lcyhkb193c3BvbHd5ZGFuaWExKSkNCiMjI3ByenlwaXNhbmllIGF1dG9yw7N3IHBvZG1pb3Rvd2VqIGRvIGxpdGVyYXR1ciBpIHByenlwaXNhbmllIGRvIHJlZGFrdG9yw7N3IG5hIHBvZHN0YXdpZSBrb2R1IGxpdGVyYXR1cnkgeiBwb2xhIFgwODAgaSB0d29yemVuaWUgbm93eWNoIHR3w7NyY8OzdyBuYSBwb2RzdGF3aWUgcG9sYSAyNDUNCndzcG9sd3lkYW5pZV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJ3c3DDs8WCd3lkYW5pZSIpICU+JSANCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fd3Nwb2x3eWRhbmlhMSRaQV9VV0FHSSkgJT4lIA0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb193c3BvbHd5ZGFuaWEyJFpBX1VXQUdJKQ0KDQp3c3BvbHd5ZGFuaWVfcmVkYWt0b3J6eSA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHdzcG9sd3lkYW5pZV9yZWRha3Rvcnp5IGENCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2luIEJOX1BCTF9saXN0YV9saXRlcmF0dXIgYiBvbiBhLlgwODAgbGlrZSAoJyUnfHxiLnVrZF9vZ29sbmV8fCclJykiKQ0KZG9fd3Nwb2x3eWRhbmlhMyA8LSB3c3BvbHd5ZGFuaWVfcmVkYWt0b3J6eSAlPiUgDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1LHBibF9pZCxwYmxfbmF6d2EscmVkYWt0b3JfZHppYWx1LHBibF9pZF9saXRlcmF0dXJ5LHBibF9saXRlcmF0dXJhLG5hendhX3Byb3N0YSx1a2Rfb2dvbG5lKSAlPiUgDQogIG11dGF0ZShYMjQ1ID0gc3RyX2V4dHJhY3QoWDI0NSwgIig/PD1cXC9cXCRjKSguKj8pKD89IDt8JCkiKSwNCiAgICAgICAgIFgyNDUgPSBzdHJfcmVtb3ZlKFgyNDUsIlxcLiQiKSwNCiAgICAgICAgIFgyNDUgPSBzdHJfcmVtb3ZlKFgyNDUsIlxcWyIpLA0KICAgICAgICAgWDI0NSA9IHN0cl9yZW1vdmUoWDI0NSwiXFxdIiksDQogICAgICAgICBuYXp3aXNrbyA9IGlmZWxzZShncmVwbCgiIFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XFwuXSogIixYMjQ1KSxhcy5jaGFyYWN0ZXIoWDI0NSksc3RyX3JlcGxhY2UoWDI0NSwiKF4uKj8pKCApKD8hLiogKSguKiQpIiwiXFwzIikpLA0KICAgICAgICAgaW1pZSA9IGlmZWxzZShncmVwbCgiIFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XFwuXSogIixYMjQ1KSwiKiIsc3RyX3JlcGxhY2UoWDI0NSwiKF4uKj8pKCApKD8hLiogKSguKiQpIiwiXFwxIikpLA0KICAgICAgICAgbmFtZSA9IHBhc3RlKG5hendpc2tvLGltaWUsc2VwID0gIiwgIikpICU+JQ0KICBtdXRhdGUocGJsX25hendhID0gYXMuY2hhcmFjdGVyKHBibF9uYXp3YSkpICU+JQ0KICBtdXRhdGUoRFpfRFpJQUxfSUQgPSBpZmVsc2UobmF6d2FfcHJvc3RhPT0icG9sc2siJnN1YnN0cihwYmxfbmF6d2EsbmNoYXIocGJsX25hendhKSxuY2hhcihwYmxfbmF6d2EpKSE9c3Vic3RyKG5hendpc2tvLDEsMSksTkEsYXMuaW50ZWdlcihwYmxfaWQpKSkgJT4lDQogIGZpbHRlcighaXMubmEoRFpfRFpJQUxfSUQpKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSxEWl9EWklBTF9JRCkNCmNvdW50IDwtIGFzLmRhdGEuZnJhbWUodGFibGUoZG9fd3Nwb2x3eWRhbmlhMyRaQV9VV0FHSSkpDQpkb193c3BvbHd5ZGFuaWEzIDwtIG1lcmdlKGRvX3dzcG9sd3lkYW5pYTMsY291bnQsYnkueCA9ICJaQV9VV0FHSSIsYnkueSA9ICJWYXIxIikgJT4lDQogIG11dGF0ZShkbHVnb3NjID0gbmNoYXIodWtkX29nb2xuZSkpICU+JQ0KICBhcnJhbmdlKC1GcmVxLFpBX1VXQUdJLC1kbHVnb3NjLHBibF9pZCkNCmRvX3dzcG9sd3lkYW5pYTMkc2FtZSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQoZG9fd3Nwb2x3eWRhbmlhM1sxXSkpDQpkb193c3BvbHd5ZGFuaWEzIDwtIGRvX3dzcG9sd3lkYW5pYTNbIWR1cGxpY2F0ZWQoZG9fd3Nwb2x3eWRhbmlhMyRzYW1lKSxdICU+JQ0KICBtdXRhdGUoVFdfVFdPUkNBX0lEID0gTkEpICU+JQ0KICByZW5hbWUoRFpfTkFaV0EgPSBwYmxfbmF6d2EsDQogICAgICAgICBUV19OQVpXSVNLTyA9IG5hendpc2tvLA0KICAgICAgICAgVFdfSU1JRSA9IGltaWUpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksVFdfVFdPUkNBX0lELFRXX05BWldJU0tPLFRXX0lNSUUsRFpfRFpJQUxfSUQsRFpfTkFaV0EscmVkYWt0b3JfZHppYWx1KSAlPiUNCiAgbXV0YXRlKFJaX1JPRFpBSl9JRCA9IDEsDQogICAgICAgICBSWl9OQVpXQSA9ICJrc2nEhcW8a2EgdHfDs3JjeSAocG9kbWlvdG93YSkiKQ0KIyMjcHJ6eXBpc2FuaWUgYXV0b3LDs3cgcG9kbWlvdG93ZWogZG8gbGl0ZXJhdHVyIGkgcHJ6eXBpc2FuaWUgZG8gcmVkYWt0b3LDs3cgbmEgcG9kc3Rhd2llIGxpdGVyYXR1cnkgeiBwb2xhIDY1NSBpIHR3b3J6ZW5pZSBub3d5Y2ggdHfDs3Jjw7N3IG5hIHBvZHN0YXdpZSBwb2xhIDI0NQ0Kd3Nwb2x3eWRhbmllX3JlZGFrdG9yenkgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09IndzcMOzxYJ3eWRhbmllIikgJT4lIA0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb193c3BvbHd5ZGFuaWExJFpBX1VXQUdJKSAlPiUgDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3dzcG9sd3lkYW5pYTIkWkFfVVdBR0kpICU+JSANCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fd3Nwb2x3eWRhbmlhMyRaQV9VV0FHSSkNCg0KIzY1NQ0KbWFyY19maWVsZF82NTUgPC0gd3Nwb2x3eWRhbmllX3JlZGFrdG9yenkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNjU1KSU+JQ0KICBmaWx0ZXIoWDY1NSE9IiIpICU+JQ0KICBtdXRhdGUoWDY1NT1zdHJfcmVwbGFjZV9hbGwoWDY1NSwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNjU1IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg2NTUhPSIiKSAlPiUNCiAgbXV0YXRlKFg2NTU9c3RyX3JlbW92ZV9hbGwoWDY1NSwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNjU1LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKHdzcG9sd3lkYW5pZV9yZWRha3Rvcnp5JFg2NTUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF82NTUpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNjU1PC1jYmluZChtYXJjX2ZpZWxkXzY1NSxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzY1NSRYNjU1IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNjU1JFg2NTUsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmlmIChucm93KG1hcmNfZmllbGRfNjU1KT4wKSB7DQogIA0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF82NTVbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF82NTUkWDY1NSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNjU1JFg2NTUpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KbWFyY19maWVsZF82NTUgPC0gbWFyY19maWVsZF82NTUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgKSAlPiUNCiAgdW5pcXVlKCkNCg0KbWFyY19maWVsZF82NTUgPC0gc3FsZGYoInNlbGVjdCAqDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBtYXJjX2ZpZWxkXzY1NSBhDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBqb2luIFBCTF9oYXNsYV9vc29ib3dlIGIgb24gYS5gJGFgIGxpa2UgKCclJ3x8Yi5uYXp3YXx8JyUnKSIpDQoNCiMjI2RvZGF3YW5pZSBuYXpld25pY3R3IG5vd3ljaCB0d8OzcmPDs3cgbmEgcG9kc3Rhd2llIDI0NQ0KbWFyY19maWVsZF8yNDUgPC0gd3Nwb2x3eWRhbmllX3JlZGFrdG9yenkgJT4lIA0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NSkgJT4lIA0KICBtdXRhdGUoWDI0NSA9IHN0cl9leHRyYWN0KFgyNDUsICIoPzw9XFwvXFwkYykoLio/KSg/PSA7fCQpIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCJcXC4kIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCJcXFsiKSwNCiAgICAgICAgIFgyNDUgPSBzdHJfcmVtb3ZlKFgyNDUsIlxcXSIpLA0KICAgICAgICAgbmF6d2lza28gPSBpZmVsc2UoZ3JlcGwoIiBbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvlxcLl0qICIsWDI0NSksYXMuY2hhcmFjdGVyKFgyNDUpLHN0cl9yZXBsYWNlKFgyNDUsIiheLio/KSggKSg/IS4qICkoLiokKSIsIlxcMyIpKSwNCiAgICAgICAgIGltaWUgPSBpZmVsc2UoZ3JlcGwoIiBbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvlxcLl0qICIsWDI0NSksIioiLHN0cl9yZXBsYWNlKFgyNDUsIiheLio/KSggKSg/IS4qICkoLiokKSIsIlxcMSIpKSwNCiAgICAgICAgIG5hbWUgPSBwYXN0ZShuYXp3aXNrbyxpbWllLHNlcCA9ICIsICIpKQ0KI2pvaW4gbmEgcG9kc3Rhd2llIGlkZW50eWN6bmVnbyBpZA0KbWFyY19maWVsZF82NTUgPC0gbWFyY19maWVsZF82NTUgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMjQ1LGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBtdXRhdGUoRFpfRFpJQUxfSUQgPSBpZmVsc2UobmF6d2E9PSJwb2xzayImc3Vic3RyKERaX05BWldBLG5jaGFyKERaX05BWldBKSxuY2hhcihEWl9OQVpXQSkpIT1zdWJzdHIobmF6d2lza28sMSwxKSxOQSxhcy5pbnRlZ2VyKERaX0RaSUFMX0lEKSkpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKERaX0RaSUFMX0lEKSkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksRFpfRFpJQUxfSUQpDQptYXJjX2ZpZWxkXzY1NSRzYW1lIDwtIGN1bXN1bSghZHVwbGljYXRlZChtYXJjX2ZpZWxkXzY1NVsxXSkpDQpkb193c3BvbHd5ZGFuaWE0IDwtIG1hcmNfZmllbGRfNjU1WyFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjU1JHNhbWUpLF0gJT4lDQogIHNlbGVjdChaQV9VV0FHSSxEWl9EWklBTF9JRCxEWl9OQVpXQSxUV19OQVpXSVNLTz1uYXp3aXNrbyxUV19JTUlFPWltaWUscmVkYWt0b3JfZHppYWx1KSAlPiUNCiAgZmlsdGVyKCFpcy5uYShEWl9EWklBTF9JRCkpICU+JQ0KICBtdXRhdGUoVFdfVFdPUkNBX0lEID0gTkEsDQogICAgICAgICBSWl9ST0RaQUpfSUQgPSAxLA0KICAgICAgICAgUlpfTkFaV0EgPSAia3NpxIXFvGthIHR3w7NyY3kgKHBvZG1pb3Rvd2EpIikgJT4lDQogIHNlbGVjdChuYW1lcyhkb193c3BvbHd5ZGFuaWEzKSkNCn0gZWxzZSB7DQogIG1hcmNfZmllbGRfMjQ1IDwtIHdzcG9sd3lkYW5pZV9yZWRha3Rvcnp5ICU+JSANCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpICU+JSANCiAgbXV0YXRlKFgyNDUgPSBzdHJfZXh0cmFjdChYMjQ1LCAiKD88PVxcL1xcJGMpKC4qPykoPz0gO3wkKSIpLA0KICAgICAgICAgWDI0NSA9IHN0cl9yZW1vdmUoWDI0NSwiXFwuJCIpLA0KICAgICAgICAgWDI0NSA9IHN0cl9yZW1vdmUoWDI0NSwiXFxbIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCJcXF0iKSwNCiAgICAgICAgIG5hendpc2tvID0gaWZlbHNlKGdyZXBsKCIgW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5cXC5dKiAiLFgyNDUpLGFzLmNoYXJhY3RlcihYMjQ1KSxzdHJfcmVwbGFjZShYMjQ1LCIoXi4qPykoICkoPyEuKiApKC4qJCkiLCJcXDMiKSksDQogICAgICAgICBpbWllID0gaWZlbHNlKGdyZXBsKCIgW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5cXC5dKiAiLFgyNDUpLCIqIixzdHJfcmVwbGFjZShYMjQ1LCIoXi4qPykoICkoPyEuKiApKC4qJCkiLCJcXDEiKSksDQogICAgICAgICBuYW1lID0gcGFzdGUobmF6d2lza28saW1pZSxzZXAgPSAiLCAiKSkNCiAgZG9fd3Nwb2x3eWRhbmlhNCA8LSBkYXRhLmZyYW1lKHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkNCn0NCiMjI3ByenlwaXNhbmllIGF1dG9yw7N3IHBvZG1pb3Rvd2VqIGRvIGxpdGVyYXR1ciBpIHByenlwaXNhbmllIGRvIHJlZGFrdG9yw7N3IG5hIHBvZHN0YXdpZSBsaXRlcmF0dXJ5IHogcG9sYSA2NTAgaSB0d29yemVuaWUgbm93eWNoIHR3w7NyY8OzdyBuYSBwb2RzdGF3aWUgcG9sYSAyNDUNCndzcG9sd3lkYW5pZV9yZWRha3Rvcnp5IDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJ3c3DDs8WCd3lkYW5pZSIpICU+JSANCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fd3Nwb2x3eWRhbmlhMSRaQV9VV0FHSSkgJT4lIA0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb193c3BvbHd5ZGFuaWEyJFpBX1VXQUdJKSAlPiUgDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3dzcG9sd3lkYW5pYTMkWkFfVVdBR0kpICU+JSANCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fd3Nwb2x3eWRhbmlhNCRaQV9VV0FHSSkNCg0KIzY1MA0KaWYgKG1heChuY2hhcih3c3BvbHd5ZGFuaWVfcmVkYWt0b3J6eSRYNjUwKSk+MCkgew0KbWFyY19maWVsZF82NTAgPC0gd3Nwb2x3eWRhbmllX3JlZGFrdG9yenkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNjUwKSU+JQ0KICBmaWx0ZXIoWDY1MCE9IiIpICU+JQ0KICBtdXRhdGUoWDY1MD1zdHJfcmVwbGFjZV9hbGwoWDY1MCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNjUwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg2NTAhPSIiKSAlPiUNCiAgbXV0YXRlKFg2NTA9c3RyX3JlbW92ZV9hbGwoWDY1MCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNjUwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKHdzcG9sd3lkYW5pZV9yZWRha3Rvcnp5JFg2NTAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF82NTApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNjUwPC1jYmluZChtYXJjX2ZpZWxkXzY1MCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzY1MCRYNjUwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNjUwJFg2NTAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNjUwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNjUwJFg2NTApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzY1MCRYNjUwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCm1hcmNfZmllbGRfNjUwIDwtIG1hcmNfZmllbGRfNjUwICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRhYCkgJT4lDQogIHVuaXF1ZSgpDQoNCm1hcmNfZmllbGRfNjUwIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gbWFyY19maWVsZF82NTAgYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBQQkxfaGFzbGFfb3NvYm93ZSBiIG9uIGEuYCRhYCBsaWtlICgnJSd8fGIubmF6d2F8fCclJykiKSAgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMjQ1LGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBtdXRhdGUoRFpfRFpJQUxfSUQgPSBpZmVsc2UobmF6d2E9PSJwb2xzayImc3Vic3RyKERaX05BWldBLG5jaGFyKERaX05BWldBKSxuY2hhcihEWl9OQVpXQSkpIT1zdWJzdHIobmF6d2lza28sMSwxKSxOQSxhcy5pbnRlZ2VyKERaX0RaSUFMX0lEKSkpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKERaX0RaSUFMX0lEKSkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksRFpfRFpJQUxfSUQpDQoNCm1hcmNfZmllbGRfNjUwJHNhbWUgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKG1hcmNfZmllbGRfNjUwWzFdKSkNCmRvX3dzcG9sd3lkYW5pYTUgPC0gbWFyY19maWVsZF82NTBbIWR1cGxpY2F0ZWQobWFyY19maWVsZF82NTAkc2FtZSksXSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLERaX0RaSUFMX0lELERaX05BWldBLFRXX05BWldJU0tPPW5hendpc2tvLFRXX0lNSUU9aW1pZSxyZWRha3Rvcl9kemlhbHUpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKERaX0RaSUFMX0lEKSkgJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSwNCiAgICAgICAgIFJaX1JPRFpBSl9JRCA9IDEsDQogICAgICAgICBSWl9OQVpXQSA9ICJrc2nEhcW8a2EgdHfDs3JjeSAocG9kbWlvdG93YSkiKSAlPiUNCiAgc2VsZWN0KG5hbWVzKGRvX3dzcG9sd3lkYW5pYTQpKQ0KfSBlbHNlIHsNCiAgZG9fd3Nwb2x3eWRhbmlhNSA8LSBkb193c3BvbHd5ZGFuaWExWzAsXQ0KfQ0KI2NvIHpvc3RhxYJvIGRvIHdzcMOzxYJ3eWRhbmlhPw0Kd3Nwb2x3eWRhbmllX3JlZGFrdG9yenkgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09IndzcMOzxYJ3eWRhbmllIikgJT4lIA0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb193c3BvbHd5ZGFuaWExJFpBX1VXQUdJKSAlPiUgDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3dzcG9sd3lkYW5pYTIkWkFfVVdBR0kpICU+JSANCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgZG9fd3Nwb2x3eWRhbmlhMyRaQV9VV0FHSSkgJT4lIA0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBkb193c3BvbHd5ZGFuaWE0JFpBX1VXQUdJKSAlPiUgDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIGRvX3dzcG9sd3lkYW5pYTUkWkFfVVdBR0kpDQoNCiNuYWRkYXRlayBwcnp5cGlzYcSHIE1hcmNpZSBqYWtvIHBvZG1pb3Rvd8SFIGJleiB0d8OzcmPDs3cgaSBjenlfYXV0b21hdHljem5pZSA8LSBuaWUNCmRvX3dzcG9sd3lkYW5pYTYgPC0gd3Nwb2x3eWRhbmllX3JlZGFrdG9yenkgJT4lDQogIG11dGF0ZShUV19UV09SQ0FfSUQgPSBOQSwNCiAgICAgICAgIFRXX05BWldJU0tPID0gTkEsDQogICAgICAgICBUV19JTUlFID0gTkEsDQogICAgICAgICBEWl9EWklBTF9JRCA9IE5BLA0KICAgICAgICAgRFpfTkFaV0EgPSBOQSwNCiAgICAgICAgIFJaX1JPRFpBSl9JRCA9IDEsDQogICAgICAgICBSWl9OQVpXQSA9ICJrc2nEhcW8a2EgdHfDs3JjeSAocG9kbWlvdG93YSkiLA0KICAgICAgICAgcmVkYWt0b3JfZHppYWx1ID0gIk1BUlRBS3giKSAlPiUNCiAgc2VsZWN0KG5hbWVzKGRvX3dzcG9sd3lkYW5pYTUpKQ0KI3RyemViYSB6YWt0dWFsaXpvd2HEhyB3IGJuX29rLCDFvGUgdGVyYXogdG8gbmllIHPEhSBhdXRvbWF0eWN6bmUNCmxpc3RhX2RvX3ByemVwaXNhbmlhIDwtIGRvX3dzcG9sd3lkYW5pYTYkWkFfVVdBR0kNCmJuX29rJGN6eV9hdXRvbWF0eWN6bmllW2JuX29rJFpBX1VXQUdJICVpbiUgbGlzdGFfZG9fcHJ6ZXBpc2FuaWFdIDwtICJuaWUiDQojcG/FgsSFY3plbmllIHByenlkemlhxYJ1IHdzcMOzxYJ3eWRhxYQgdyBqZWRlbiBwbGlrDQpkb193c3BvbHd5ZGFuaWEgPC0gcmJpbmQoZG9fd3Nwb2x3eWRhbmlhMSxkb193c3BvbHd5ZGFuaWEyLGRvX3dzcG9sd3lkYW5pYTMsZG9fd3Nwb2x3eWRhbmlhNCxkb193c3BvbHd5ZGFuaWE1LGRvX3dzcG9sd3lkYW5pYTYpDQoNCiNwb8WCxIVjemVuaWUgcHJ6eWR6aWHFgsOzdyB3IGplZGVuIHBsaWsgKHogd3lrbHVjemVuaWVtIHdzcMOzxYJ3eWRhbmlhLCBibyBvbm8gaWR6aWUgcG8gemFfdXdhZ2kpDQpyZWRha3Rvcnp5X3phcGlzb3cgPC0gcmJpbmQoZG9fcG9kbWlvdG93ZWosZG9fcHJ6ZWRtaW90b3dlaixkb19hbnRvbG9naWksZG9fd3Nwb2x3eWRhbmlhKQ0KI3BvxYLEhWN6ZW5pZSBwcnp5cGlzYW5pYSB6ZSB6YmlvcmVtDQoNCmJuX29rIDwtIGJuX29rICU+JQ0KICBsZWZ0X2pvaW4oLixyZWRha3Rvcnp5X3phcGlzb3csYnk9IlpBX1VXQUdJIikgJT4lDQogIG11dGF0ZShyZWRha3Rvcl9kemlhbHUgPSBpZmVsc2UoaXMubmEoRFpfTkFaV0EpLGFzLmNoYXJhY3RlcihyZWRha3Rvcl9kemlhbHUpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShEWl9OQVpXQT09Ikhhc8WCYSBvc29ib3dlIChsaXRlcmF0dXJhIHBvbHNrYSkgLSBCIiwiUEFVTElOQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShEWl9OQVpXQT09Ikhhc8WCYSBvc29ib3dlIChsaXRlcmF0dXJhIHBvbHNrYSkgLSBHIiwiTUFSVEFLIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShEWl9OQVpXQT09Ikhhc8WCYSBvc29ib3dlIChsaXRlcmF0dXJhIHBvbHNrYSkgLSBMIiwiQkVBVEFLIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRFpfTkFaV0E9PSJMaXRlcmF0dXJhIHdzcMOzxYJjemVzbmEgKHV0d29yeSBhbm9uaW1vd2UgaSB1bG90bmUpIiwiQU5JQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShEWl9OQVpXQT09IlV0d29yeSBhbm9uaW1vd2UgaSB1bG90bmUiLCJBTklBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShEWl9OQVpXQT09IlV0d29yeSBhbm9uaW1vd2UgaSB1bG90bmUgKGVwb2thIG5pZXpuYW5hKSIsIkFOSUEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShEWl9OQVpXQT09Ikhhc8WCYSBvc29ib3dlIChsaXRlcmF0dXJhIHBvbHNrYSkgLSBOIiwiR09TSUEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRFpfTkFaV0E9PSJIYXPFgmEgb3NvYm93ZSAobGl0ZXJhdHVyYSBwb2xza2EpIC0gTyIsIklaQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRFpfTkFaV0E9PSJIYXPFgmEgb3NvYm93ZSAobGl0ZXJhdHVyYSBwb2xza2EpIC0gUSIsIklaQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKERaX05BWldBPT0iTGl0ZXJhdHVyYSBicnl0eWpza2EgaSBpcmxhbmR6a2EiLCJFV0EiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRFpfTkFaV0E9PSJVdHdvcnkgYW5vbmltb3dlIChicnl0eWpza2EgaSBpcmxhbmR6a2EpIiwiRVdBIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShEWl9OQVpXQT09Ikhhc8WCYSBvc29ib3dlIChsaXRlcmF0dXJhIHBvbHNrYSkgLSBVIiwiUEFVTElOQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKERaX05BWldBPT0iSGFzxYJhIG9zb2Jvd2UgKGxpdGVyYXR1cmEgcG9sc2thKSAtIFgiLCJQQVVMSU5BIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKERaX05BWldBPT0iSGFzxYJhIG9zb2Jvd2UgKGxpdGVyYXR1cmEgcG9sc2thKSAtIFYiLCJQQVVMSU5BIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShEWl9OQVpXQT09Ikhhc8WCYSBvc29ib3dlIChsaXRlcmF0dXJhIHBvbHNrYSkgLSBZIiwiUEFVTElOQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKERaX05BWldBPT0iSGFzxYJhIG9zb2Jvd2UgKGxpdGVyYXR1cmEgcG9sc2thKSAtIEMiLCJHT1NJQSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShEWl9OQVpXQT09Ikhhc8WCYSBvc29ib3dlIChsaXRlcmF0dXJhIHBvbHNrYSkgLSBEIiwiR09TSUEiLGFzLmNoYXJhY3RlcihyZWRha3Rvcl9kemlhbHUpKSkpKSkpKSkpKSkpKSkpKSkpKQ0KDQojdWplZG5vbGljZW5pZSBsaXRlcmF0dXJ5IGRsYSBraWxrdSB6YXBpc8OzdyBub3dlZ28gdHfDs3JjeQ0Ka2lsa2FfbGl0ZXJhdHVyX25vd2Vnb190d29yY3kgPC0gYm5fb2sgJT4lDQogIHNlbGVjdChpZCxUV19UV09SQ0FfSUQsVFdfTkFaV0lTS08sVFdfSU1JRSxEWl9EWklBTF9JRCxEWl9OQVpXQSxyZWRha3Rvcl9kemlhbHUpICU+JQ0KICBmaWx0ZXIoaXMubmEoVFdfVFdPUkNBX0lEKSYhaXMubmEoVFdfTkFaV0lTS08pKSAlPiUNCiAgc2VsZWN0KC1UV19UV09SQ0FfSUQpICU+JQ0KICBhcnJhbmdlKFRXX05BWldJU0tPLFRXX0lNSUUpICU+JQ0KICBncm91cF9ieV9hdCh2YXJzKDI6MykpICU+JQ0KICBtdXRhdGUodW5pa2F0b3d5X2R6aWFsID0gcGFzdGUodW5pcXVlKERaX0RaSUFMX0lEKSxjb2xsYXBzZSA9ICJ8IiksDQogICAgICAgICBEWl9EWklBTF9JRCA9IHBhc3RlKERaX0RaSUFMX0lELGNvbGxhcHNlID0gInwiKSwNCiAgICAgICAgIERaX05BWldBID0gcGFzdGUoRFpfTkFaV0EsY29sbGFwc2UgPSAifCIpLA0KICAgICAgICAgcmVkYWt0b3JfZHppYWx1ID0gcGFzdGUocmVkYWt0b3JfZHppYWx1LGNvbGxhcHNlID0gInwiKSwNCiAgICAgICAgIGlkID0gcGFzdGUoaWQsY29sbGFwc2UgPSAifCIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgZmlsdGVyKGdyZXBsKCJcXHwiLHVuaWthdG93eV9kemlhbCkpICU+JQ0KICBzZWxlY3QoLXVuaWthdG93eV9kemlhbCkNCmlmKG5yb3coa2lsa2FfbGl0ZXJhdHVyX25vd2Vnb190d29yY3kpPjApIHsNCiAga2lsa2FfbGl0ZXJhdHVyX25vd2Vnb190d29yY3kgPC0ga2lsa2FfbGl0ZXJhdHVyX25vd2Vnb190d29yY3kgJT4lDQogIG11dGF0ZShpZF9ncnVweSA9IDE6bnJvdyguKSkgJT4lDQogIGNTcGxpdCguLGMoImlkIiwiRFpfRFpJQUxfSUQiLCJEWl9OQVpXQSIsInJlZGFrdG9yX2R6aWFsdSIpLHNlcCA9ICJ8IixkaXJlY3Rpb24gPSAibG9uZyIpDQoNCmtpbGthX2xpdGVyYXR1cl9ub3dlZ29fdHdvcmN5WywyOjddW2R1cGxpY2F0ZWQoa2lsa2FfbGl0ZXJhdHVyX25vd2Vnb190d29yY3kkaWRfZ3J1cHkpLF0gPC0gTkENCmtpbGthX2xpdGVyYXR1cl9ub3dlZ29fdHdvcmN5IDwtIGZpbGxfKGtpbGthX2xpdGVyYXR1cl9ub3dlZ29fdHdvcmN5LCBuYW1lcyhraWxrYV9saXRlcmF0dXJfbm93ZWdvX3R3b3JjeSkpDQojemFrdHVhbGl6b3dhbmllIHpiaW9ydSBwb2RtaW90b3d5Y2ggbyB1amVkbm9saWNvbmUgZHppYcWCeSBkbGEgbm93eWNoIHR3w7NyY8Ozdw0KeCA8LSAxOmxlbmd0aChraWxrYV9saXRlcmF0dXJfbm93ZWdvX3R3b3JjeSRpZCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgYm5fb2skRFpfRFpJQUxfSURbYm5fb2skaWQ9PWtpbGthX2xpdGVyYXR1cl9ub3dlZ29fdHdvcmN5JGlkW2ldXSA8LSBraWxrYV9saXRlcmF0dXJfbm93ZWdvX3R3b3JjeSREWl9EWklBTF9JRFtpXQ0KICBibl9vayREWl9OQVpXQVtibl9vayRpZD09a2lsa2FfbGl0ZXJhdHVyX25vd2Vnb190d29yY3kkaWRbaV1dIDwtIGFzLmNoYXJhY3RlcihraWxrYV9saXRlcmF0dXJfbm93ZWdvX3R3b3JjeSREWl9OQVpXQSlbaV0NCiAgYm5fb2skcmVkYWt0b3JfZHppYWx1W2JuX29rJGlkPT1raWxrYV9saXRlcmF0dXJfbm93ZWdvX3R3b3JjeSRpZFtpXV0gPC0gYXMuY2hhcmFjdGVyKGtpbGthX2xpdGVyYXR1cl9ub3dlZ29fdHdvcmN5JHJlZGFrdG9yX2R6aWFsdSlbaV0NCn0NCn0NCg0KI2plxZtsaSBuaWUgbWEgZHppYcWCdSBsdWIgcm9kemFqdSB6YXBpc3UsIHRvIHdwaXNhxIcgaWQgaSBuYXp3xJkgZG8gdXN0YWxlbmlhDQpibl9vayA8LSBibl9vayAlPiUNCiAgbXV0YXRlKERaX0RaSUFMX0lEID1pZmVsc2UoaXMubmEoRFpfRFpJQUxfSUQpLDAsYXMuaW50ZWdlcihEWl9EWklBTF9JRCkpLA0KICAgICAgICAgRFpfTkFaV0EgPSBpZmVsc2UoaXMubmEoRFpfTkFaV0EpLCItLSBkbyB1c3RhbGVuaWEgLS0iLGFzLmNoYXJhY3RlcihEWl9OQVpXQSkpLA0KICAgICAgICAgUlpfUk9EWkFKX0lEID1pZmVsc2UoaXMubmEoUlpfUk9EWkFKX0lEKSwwLGFzLmludGVnZXIoUlpfUk9EWkFKX0lEKSksDQogICAgICAgICBSWl9OQVpXQSA9IGlmZWxzZShpcy5uYShSWl9OQVpXQSksIi0tIGRvIHVzdGFsZW5pYSAtLSIsYXMuY2hhcmFjdGVyKFJaX05BWldBKSkpDQoNCiN1c3VuacSZY2llIG5hZHd5xbxraSB6IGtzacSFxbxlayB6IGR6aWHFgsOzdyBJSA0Kc2xvd25pa2lfamV6eWtvd2VfemxlIDwtIGJuX29rICU+JSANCiAgZmlsdGVyKERaX05BWldBPT0iU8WCb3duaWtpIGrEmXp5a293ZSIpICU+JSANCiAgZmlsdGVyKCFncmVwbCgic8WCb3duaWsiLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKSkNCg0Kc2xvd25pa2lfYmlvZ3JhZmljem5lX3psZSA8LSBibl9vayAlPiUgDQogIGZpbHRlcihEWl9OQVpXQT09IlPFgm93bmlraSBiaW9ncmFmaWN6bmUiKSAlPiUgDQogIGZpbHRlcighKGdyZXBsKCJTxYJvd25payBiaW9ncmFmaWN6bnl8QmlvZ3JhZmlhIixYNjU1KSYoZ3JlcGwoInBpc2FyenxsaXRlcmF8YWt0b3J8c2Nlbm9ncmFmfG5hdWN6eWNpZWx8YWthZGVtaXxuYXVrfGZpbG9sb2d8a3J5dHl8bGl0XFwuIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSl8Z3JlcGwoInBpc2FyenxsaXRlcmF8YWt0b3J8c2Nlbm9ncmFmfG5hdWN6eWNpZWx8YWthZGVtaXxuYXVrfGZpbG9sb2d8a3J5dHl8bGl0XFwuIixYNjUwLGlnbm9yZS5jYXNlID0gVFJVRSkpKSkNCg0KYm5fb2sgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihaQV9VV0FHSSAlbm90aW4lIHNsb3duaWtpX2plenlrb3dlX3psZSRaQV9VV0FHSSkgJT4lIA0KICBmaWx0ZXIoWkFfVVdBR0kgJW5vdGluJSBzbG93bmlraV9iaW9ncmFmaWN6bmVfemxlJFpBX1VXQUdJKQ0KY2h1bmsxMSA8LSBibl9vaw0KYGBgDQoNCmBgYHtyIHN0YXR5c3R5a2kgcHJhY293bmlrw7N3fQ0KI2JlenBpZWN6bmlrIC0gc3ByYXdkxbosIGN6eSByb3prxYJhZCBqZXN0IG5pZWtvbnRyb3dlcnN5am55DQojYmV6IGF1dG9tYXR1DQpibl9vayA8LSBjaHVuazExDQpjb3VudCA8LSBhcy5kYXRhLmZyYW1lKHRhYmxlKGJuX29rJHJlZGFrdG9yX2R6aWFsdSxibl9vayRjenlfYXV0b21hdHljem5pZSkpICU+JSANCiAgZmlsdGVyKFZhcjI9PSJuaWUiKSAlPiUgDQogIGFycmFuZ2UoLUZyZXEpDQoNCiNpbGUga3NpxIXFvGVrIG1hIGF1dG9tYXQNCg0KY291bnQyIDwtIGFzLmRhdGEuZnJhbWUodGFibGUoYm5fb2skY3p5X2F1dG9tYXR5Y3puaWUpKQ0KDQojcmVhbG5lIHN0YXR5c3R5a2kgcG8gcG9kbWlvdG93ZWoNCiMgdGVzdCA8LSBibl9vayAlPiUNCiMgICBsZWZ0X2pvaW4ob3V0ICU+JSBzZWxlY3QocmVrb3JkX0JOLHByYWNvd25payksYnk9YygiWkFfVVdBR0kiPSJyZWtvcmRfQk4iKSkgJT4lDQojICAgbXV0YXRlKHByYWNvd25payA9IGlmZWxzZShpcy5uYShwcmFjb3duaWspLGFzLmNoYXJhY3RlcihyZWRha3Rvcl9kemlhbHUpLGFzLmNoYXJhY3RlcihwcmFjb3duaWspKSwNCiMgICAgICAgICAgcHJhY293bmlrID0gc3RyX3JlcGxhY2UocHJhY293bmlrLCIoXi4qPykoXFxfLiokKSIsIlxcMSIpKQ0KIyANCiMgY291bnQzIDwtIGFzLmRhdGEuZnJhbWUodGFibGUodGVzdCRwcmFjb3duaWspKSAlPiUNCiMgICBhcnJhbmdlKC1GcmVxKQ0KIyANCiMgY291bnQ0IDwtIGFzLmRhdGEuZnJhbWUodGFibGUodGVzdCRwcmFjb3duaWssdGVzdCREWl9OQVpXQSkpICU+JQ0KIyAgIGZpbHRlcihWYXIxPT0iRVdBIiZGcmVxPjApICU+JQ0KIyAgIGFycmFuZ2UoLUZyZXEpDQpgYGANCg0KYGBge3Iga3NpxIXFvGtpIHBvZG1pb3Rvd2V9DQpibl9vayA8LSBjaHVuazExDQpkYXRhIDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJwb2RtaW90b3dhIikgJT4lDQogIG11dGF0ZShyZWRha3Rvcl9kemlhbHUgPSBwYXN0ZShyZWRha3Rvcl9kemlhbHUsIl9wb2RtIixzZXAgPSAiIikpDQoNCiN1d29sbmllbmllIGtvbHVtbiB6IGRhbnltaSB6IGJuIGkgcHJ6ZXR3b3J6ZW5pZSBkbyBQQkwNCiMxOiB6YV91d2FnaSwgcnpfbmF6d2EsIHphX3JvX3JvaywgemFfdHlwZSwgcnpfcm9kemFqX2lkLCB0d190d29yY2FfaWQsIHR3X25hendpc2tvLCB0d19pbWllLCBkel9kemlhbF9pZCwgZHpfbmF6d2EsIHJlZGFrdG9yX2R6aWFsdQ0KcG9sYV9wYmwgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLCBSWl9OQVpXQSwgWkFfUk9fUk9LID0gcm9rLCBSWl9ST0RaQUpfSUQsIFRXX1RXT1JDQV9JRCwgVFdfTkFaV0lTS08sIFRXX0lNSUUsIERaX0RaSUFMX0lELCBEWl9OQVpXQSwgcmVkYWt0b3JfZHppYWx1KSAlPiUNCiAgbXV0YXRlKFpBX1RZUEUgPSAiS1MiKQ0KIzI6IGF1dG9yDQpCTl9hdXRvciA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWDEwMCxYMjQ1LFpBX1VXQUdJKQ0KI3BvbGUgMTAwDQptYXJjX2ZpZWxkXzEwMCA8LSBCTl9hdXRvciAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgxMDApJT4lDQogIGZpbHRlcihYMTAwIT0iIikgJT4lDQogIG11dGF0ZShYMTAwPXN0cl9yZXBsYWNlX2FsbChYMTAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgxMDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDEwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDEwMD1zdHJfcmVtb3ZlX2FsbChYMTAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgxMDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoQk5fYXV0b3IkWDEwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzEwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8xMDA8LWNiaW5kKG1hcmNfZmllbGRfMTAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMTAwJFgxMDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8xMDAkWDEwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8xMDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8xMDAkWDEwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMTAwJFgxMDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KI3BvbGUgMjQ1DQptYXJjX2ZpZWxkXzI0NSA8LSBCTl9hdXRvciAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNDUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNDUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoQk5fYXV0b3IkWDI0NSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI0NSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNDU8LWNiaW5kKG1hcmNfZmllbGRfMjQ1LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjQ1JFgyNDUgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNDUkWDI0NSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8yNDVbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8yNDUkWDI0NSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMjQ1JFgyNDUpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCmlmKCIkYiIgJWluJSBjb2xuYW1lcyhtYXJjX2ZpZWxkXzEwMCk9PVRSVUUpIHsgDQpCTl9hdXRvciA8LSBtYXJjX2ZpZWxkXzEwMCAlPiUNCiBzZWxlY3QoWkFfVVdBR0ksYCRhYCxgJGJgKSAlPiUNCiB1bmlxdWUoKSAlPiUNCiBtdXRhdGUoYCRhYCA9IGlmZWxzZSghaXMubmEoYCRiYCkscGFzdGUoYCRhYCxgJGJgLHNlcCA9ICIgIiksYXMuY2hhcmFjdGVyKGAkYWApKSkgJT4lDQogbXV0YXRlKGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIig/PD1bYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pKFxcLiQpIikpICU+JQ0KIHVuaXF1ZSgpICU+JQ0KIG11dGF0ZShBTV9OQVpXSVNLTyA9IGlmZWxzZShncmVwbCgiXFx8IixgJGFgKSwgc3RyX3JlcGxhY2VfYWxsKHN0cl9yZW1vdmVfYWxsKGAkYWAsIiwiKSwiXFx8IiwiLCAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIsIixgJGFgKSxzdHJfcmVwbGFjZV9hbGwoYCRhYCwiKC4qPykoLCApKC4qKSIsIlxcMSIpLGFzLmNoYXJhY3RlcihgJGFgKSkpLA0KICAgICAgICBBTV9JTUlFID0gaWZlbHNlKGdyZXBsKCJcXHwiLGAkYWApLCIqIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIiwiLGAkYWApLHN0cl9yZXBsYWNlX2FsbChgJGFgLCIoLio/KSgsICkoLiopIiwiXFwzIiksIioiKSkpICU+JQ0KIHNlbGVjdChaQV9VV0FHSSxBTV9OQVpXSVNLTyxBTV9JTUlFKSAlPiUNCiBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzI0NSxieT0iWkFfVVdBR0kiKSAlPiUNCiBzZWxlY3QoWkFfVVdBR0ksQU1fTkFaV0lTS08sQU1fSU1JRSwgWDI0NWMgPSBgJGNgKQ0KfSBlbHNlIHsNCiAgQk5fYXV0b3IgPC0gbWFyY19maWVsZF8xMDAgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlbW92ZShgJGFgLCIoPzw9W2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKShcXC4kKSIpKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShBTV9OQVpXSVNLTyA9IGlmZWxzZShncmVwbCgiXFx8IixgJGFgKSwgc3RyX3JlcGxhY2VfYWxsKHN0cl9yZW1vdmVfYWxsKGAkYWAsIiwiKSwiXFx8IiwiLCAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIsIixgJGFgKSxzdHJfcmVwbGFjZV9hbGwoYCRhYCwiKC4qPykoLCApKC4qKSIsIlxcMSIpLGFzLmNoYXJhY3RlcihgJGFgKSkpLA0KICAgICAgICBBTV9JTUlFID0gaWZlbHNlKGdyZXBsKCJcXHwiLGAkYWApLCIqIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIiwiLGAkYWApLHN0cl9yZXBsYWNlX2FsbChgJGFgLCIoLio/KSgsICkoLiopIiwiXFwzIiksIioiKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksQU1fTkFaV0lTS08sQU1fSU1JRSkgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMjQ1LGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksQU1fTkFaV0lTS08sQU1fSU1JRSwgWDI0NWMgPSBgJGNgKQ0KfQ0KICANCnggPC0gMTpsZW5ndGhzKEJOX2F1dG9yWzFdKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgQk5fYXV0b3IkY3p5X25hendpc2tvW2ldIDwtIGdyZXBsKEJOX2F1dG9yJEFNX05BWldJU0tPW2ldLEJOX2F1dG9yJFgyNDVjW2ldKQ0KICBCTl9hdXRvciRjenlfaW1pZVtpXSA8LSBncmVwbChCTl9hdXRvciRBTV9JTUlFW2ldLEJOX2F1dG9yJFgyNDVjW2ldKQ0KfQ0KDQpCTl9hdXRvciA8LSBCTl9hdXRvciAlPiUNCiAgbXV0YXRlKFpBX0FETk9UQUNKRSA9IGlmZWxzZShjenlfbmF6d2lza289PUZBTFNFfGN6eV9pbWllPT1GQUxTRSxwYXN0ZSgiVVdBR0EhIEtvbmZsaWt0IHcgZGFueWNoIG9zb2Jvd3ljaCB3IHBvbGFjaCAxMDAgaSAyNDUuIFBvcsOzd25haiBwb2xlIGF1dG9yIHcgZm9ybXVsYXJ6dSB6IHBvbGVtIEJOOiAiLFgyNDVjLHNlcCA9ICIiKSxOQSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksQU1fTkFaV0lTS08sQU1fSU1JRSxaQV9BRE5PVEFDSkUpICU+JQ0KICBtdXRhdGUobmF6d2EgPSBzdHJfcmVwbGFjZV9hbGwoc3RyX3RvX2xvd2VyKHBhc3RlKEFNX05BWldJU0tPLEFNX0lNSUUsIHNlcCA9ICIiKSksICJcXFciLCAiIikpICU+JQ0KICBsZWZ0X2pvaW4oLixQQkxfYXV0b3J6eSAlPiUgc2VsZWN0KEFNX0FVVE9SX0lELEFNX0tSWVBUT05JTSxBTV9MSUNaQkFfWkFQSVNPVyxuYXp3YSkgJT4lIGZpbHRlcihpcy5uYShBTV9LUllQVE9OSU0pKSxieT0ibmF6d2EiKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSxBTV9OQVpXSVNLTyxBTV9JTUlFLC1BTV9MSUNaQkFfWkFQSVNPVykNCkJOX2F1dG9yJGlkX2dydXB5IDwtIGN1bXN1bSghZHVwbGljYXRlZChCTl9hdXRvclsxOjNdKSkNCkJOX2F1dG9yIDwtIEJOX2F1dG9yWyFkdXBsaWNhdGVkKEJOX2F1dG9yJGlkX2dydXB5KSxdICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksQU1fTkFaV0lTS08sQU1fSU1JRSxaQV9BRE5PVEFDSkUsQU1fQVVUT1JfSUQpDQoNCiMzOiB0eXR1xYINCiNwb2xlIDI0NQ0KbWFyY19maWVsZF8yNDUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIn4iKSwNCiAgICAgICAgIFgyNDU9c3RyX3JlcGxhY2VfYWxsKFgyNDUsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDI0NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8yNDUpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMjQ1PC1jYmluZChtYXJjX2ZpZWxkXzI0NSxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzI0NSRYMjQ1IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMjQ1JFgyNDUsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMjQ1WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMjQ1JFgyNDUpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzI0NSRYMjQ1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQppZigiJG4iICVpbiUgY29sbmFtZXMobWFyY19maWVsZF8yNDUpKSB7DQptYXJjX2ZpZWxkXzI0NSA8LSBtYXJjX2ZpZWxkXzI0NSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWAsYCRiYCxgJG5gLGAkcGApICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShgJGFgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksY29sbGFwc2UgPSAiICIpLA0KICAgICAgICAgYCRiYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGJgKSwiIixhcy5jaGFyYWN0ZXIoYCRiYCkpLGNvbGxhcHNlID0gIiAiKSwNCiAgICAgICAgIGAkbmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRuYCksIiIsYXMuY2hhcmFjdGVyKGAkbmApKSxjb2xsYXBzZSA9ICIgIiksDQogICAgICAgICBgJHBgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkcGApLCIiLGFzLmNoYXJhY3RlcihgJHBgKSksY29sbGFwc2UgPSAiICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgdW5pdGUoIlpBX1RZVFVMIixgJGFgOmAkcGAsc2VwID0gIiAiLG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoWkFfVFlUVUwgPSBzdHJfcmVwbGFjZV9hbGwoWkFfVFlUVUwsIiArIiwiICIpLA0KICAgICAgICAgWkFfVFlUVUwgPSBzdHJfcmVtb3ZlKFpBX1RZVFVMLCAiXFxzK1xcL1xcc3swLH0kIiksDQogICAgICAgICBaQV9UWVRVTCA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWkFfVFlUVUwpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixaQV9UWVRVTCksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsWkFfVFlUVUwpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKSguKSIsWkFfVFlUVUwpLGdzdWIoIihcXFcpKCApKDp8OykoICkoLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSxhcy5jaGFyYWN0ZXIoWkFfVFlUVUwpKSkpKSwNCiAgICAgICAgIFpBX1RZVFVMID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLGFzLmNoYXJhY3RlcihaQV9UWVRVTCkpKSkpLA0KICAgICAgICAgWkFfVFlUVUwgPSBzdHJfcmVwbGFjZV9hbGwoWkFfVFlUVUwsIlxcLnszfSBcXC57M30iLCIuLi4gIiksDQogICAgICAgICBaQV9UWVRVTCA9IHN0cl9yZXBsYWNlX2FsbChaQV9UWVRVTCwiIDsgIiwiLiAiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gZ3N1YigiKCA6ICkoLikiLCIuIFxcVVxcMiIscGVybD1UUlVFLFpBX1RZVFVMKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxaQV9UWVRVTCkNCn0gZWxzZSB7DQogIG1hcmNfZmllbGRfMjQ1IDwtIG1hcmNfZmllbGRfMjQ1ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRhYCxgJGJgKSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoYCRhYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGFgKSwiIixhcy5jaGFyYWN0ZXIoYCRhYCkpLGNvbGxhcHNlID0gIiAiKSwNCiAgICAgICAgIGAkYmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRiYCksIiIsYXMuY2hhcmFjdGVyKGAkYmApKSxjb2xsYXBzZSA9ICIgIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICB1bml0ZSgiWkFfVFlUVUwiLGAkYWA6YCRiYCxzZXAgPSAiICIsbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZShaQV9UWVRVTCA9IHN0cl9yZXBsYWNlX2FsbChaQV9UWVRVTCwiICsiLCIgIiksDQogICAgICAgICBaQV9UWVRVTCA9IHN0cl9yZW1vdmUoWkFfVFlUVUwsICJcXHMrXFwvXFxzezAsfSQiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLGFzLmNoYXJhY3RlcihaQV9UWVRVTCkpKSkpLA0KICAgICAgICAgWkFfVFlUVUwgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWkFfVFlUVUwpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLFpBX1RZVFVMKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxaQV9UWVRVTCksYXMuY2hhcmFjdGVyKFpBX1RZVFVMKSkpKSksDQogICAgICAgICBaQV9UWVRVTCA9IHN0cl9yZXBsYWNlX2FsbChaQV9UWVRVTCwiXFwuezN9IFxcLnszfSIsIi4uLiAiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gc3RyX3JlcGxhY2VfYWxsKFpBX1RZVFVMLCIgOyAiLCIuICIpLA0KICAgICAgICAgWkFfVFlUVUwgPSBnc3ViKCIoIDogKSguKSIsIi4gXFxVXFwyIixwZXJsPVRSVUUsWkFfVFlUVUwpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFpBX1RZVFVMKQ0KfQ0KI2RvcGlzYW5pZSBnYXR1bmt1IGRvIHByemVkbWlvdG93ZWogbmEgcG9kc3Rhd2llIDY1NSBpIDY1MCAgDQpnYXR1bmtpX3BibCA8LSBkYXRhLmZyYW1lKGdhdHVuZWsgPSBjKCJhZm9yeXptIiwgImFsYnVtIiwgImFudG9sb2dpYSIsICJhdXRvYmlvZ3JhZmlhIiwgImR6aWVubmlrIiwgImVzZWoiLCAiZmVsaWV0b24iLCAiaW5uZSIsICJrYXphbmllIiwgImxpc3QiLCAibWluaWF0dXJhIHByb3rEhSIsICJvcG93aWFkYW5pZSIsICJwb2VtYXQiLCAicG93aWXFm8SHIiwgInByb3phIiwgInByb3phIHBvZXR5Y2thIiwgInJlcG9ydGHFvCIsICJyb3ptecWbbGFuaWUgcmVsaWdpam5lIiwgInJ5c3VuZWssIG9icmF6IiwgInNjZW5hcml1c3oiLCAic3praWMiLCAidGVrc3QgYmlibGlqbnkiLCAidGVrc3QgZHJhbWF0eWN6bnkiLCAiZHJhbWF0IiwgIndpZXJzeiIsICJ3c3BvbW5pZW5pYSIsICJ3eXBvd2llZMW6IiwgInBhbWnEmXRuaWtpIiwgInBvZXpqYSIsICJsaXRlcmF0dXJhIHBvZHLDs8W8bmljemEiLCAic2F0eXJhIiwgInBpb3NlbmthIikpDQoNCiNkcmFtYXQsIHBhbWnEmXRuaWtpLCBwb2V6amEsIGxpdGVyYXR1cmEgcG9kcsOzxbxuaWN6YSwgc2F0eXJhLCBwaW9zZW5rYQ0KZ2F0dW5raV9ibiA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDY1NSxYNjUwKQ0KDQpnYXR1bmtpX2JuIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICBmcm9tIGdhdHVua2lfYm4NCiAgICAgICAgICAgICAgICAgICAgbGVmdCBqb2luIGdhdHVua2lfcGJsIG9uIGxvd2VyKGdhdHVua2lfYm4uWDY1NSkgbGlrZSAnJSd8fGdhdHVua2lfcGJsLmdhdHVuZWt8fCclJyIpDQpnYXR1bmtpX2JuIDwtIHNxbGRmKCJzZWxlY3QgKg0KICAgICAgICAgICAgICAgICAgICAgIGZyb20gZ2F0dW5raV9ibg0KICAgICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBnYXR1bmtpX3BibCBvbiBsb3dlcihnYXR1bmtpX2JuLlg2NTApIGxpa2UgJyUnfHxnYXR1bmtpX3BibC5nYXR1bmVrfHwnJSciKQ0KY29sbmFtZXMoZ2F0dW5raV9ibilbNV0gPC0gImdhdHVuZWsyIg0KZ2F0dW5raV9ibiA8LSBnYXR1bmtpX2JuICU+JQ0KICBtdXRhdGUoZ2F0dW5layA9IGlmZWxzZShpcy5uYShnYXR1bmVrKSYhaXMubmEoZ2F0dW5lazIpLGFzLmNoYXJhY3RlcihnYXR1bmVrMiksYXMuY2hhcmFjdGVyKGdhdHVuZWspKSwNCiAgICAgICAgIGdhdHVuZWsgPSBpZmVsc2UoZ3JlcGwoInByenlwb3dpZcWbxIciLFg2NTUsaWdub3JlLmNhc2UgPSBUUlVFKSYhZ3JlcGwoIlteeV1wb3dpZcWbxIciLFg2NTUpJmdhdHVuZWs9PSJwb3dpZcWbxIciLCJvcG93aWFkYW5pZSIsYXMuY2hhcmFjdGVyKGdhdHVuZWspKSkgJT4lDQogIGZpbHRlcighaXMubmEoZ2F0dW5laykpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksZ2F0dW5laykgJT4lDQogIG11dGF0ZShnYXR1bmVrID0gaWZlbHNlKGdhdHVuZWs9PSJkcmFtYXQiLCJ0ZWtzdCBkcmFtYXR5Y3pueSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnYXR1bmVrPT0icGFtacSZdG5pa2kiLCJ3c3BvbW5pZW5pYSIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2F0dW5laz09InBvZXpqYSIsIndpZXJzeiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdhdHVuZWs9PSJsaXRlcmF0dXJhIHBvZHLDs8W8bmljemEiLCJyZXBvcnRhxbwiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2F0dW5laz09InBpb3NlbmthIiwid2llcnN6Iixhcy5jaGFyYWN0ZXIoZ2F0dW5laykpKSkpKSkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKGdhdHVuZWsgPSBwYXN0ZShnYXR1bmVrLGNvbGxhcHNlID0gIiwgIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUoZ2F0dW5layA9IGdzdWIoIiheLikiLCJcXFVcXDEiLHBlcmwgPSBUUlVFLCBnYXR1bmVrKSkNCiNwb8WCxIVjemVuaWUgdHl0dcWCdSB6IGdhdHVua2llbQ0KemFfdHl0dWwgPC0gbWFyY19maWVsZF8yNDUgJT4lDQogIGxlZnRfam9pbiguLGdhdHVua2lfYm4sYnk9IlpBX1VXQUdJIikgJT4lIA0KICBtdXRhdGUoZ2F0dW5layA9IHBhc3RlKCJbIixnYXR1bmVrLCJdIixzZXAgPSAiIiksDQogICAgICAgICBnYXR1bmVrID0gaWZlbHNlKGdhdHVuZWs9PSJbTkFdIixOQSxhcy5jaGFyYWN0ZXIoZ2F0dW5laykpKSAlPiUgDQogIHVuaXRlKCJaQV9UWVRVTCIsIFpBX1RZVFVMOmdhdHVuZWssIHNlcCA9ICIuICIsbmEucm09VFJVRSkgJT4lIA0KICBtdXRhdGUoWkFfVFlUVUwgPSBzdHJfcmVwbGFjZV9hbGwoWkFfVFlUVUwsIlxcLiBcXC4iLCIuICIpLA0KICAgICAgICAgWkFfVFlUVUwgPSBzdHJfcmVwbGFjZShaQV9UWVRVTCwiKFxcISkoXFwuKXwoXFw/KShcXC4pIiwiXFwxIikpDQoNCiM0OiB0eXR1xYIgb3J5Z2luYcWCdQ0KI3BvbGUgMjQ2DQptYXJjX2ZpZWxkXzI0NiA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NiklPiUNCiAgZmlsdGVyKFgyNDYhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDY9c3RyX3JlbW92ZV9hbGwoWDI0NiwifiIpLA0KICAgICAgICAgWDI0Nj1zdHJfcmVwbGFjZV9hbGwoWDI0NiwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMjQ2IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgyNDYhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDY9c3RyX3JlbW92ZV9hbGwoWDI0NiwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMjQ2LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDI0NiwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI0NilbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNDY8LWNiaW5kKG1hcmNfZmllbGRfMjQ2LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjQ2JFgyNDYgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNDYkWDI0NixzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8yNDZbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8yNDYkWDI0Niksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMjQ2JFgyNDYpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCmlmKCIkbiIgJWluJSBjb2xuYW1lcyhtYXJjX2ZpZWxkXzI0NikpIHsNCm1hcmNfZmllbGRfMjQ2IDwtIG1hcmNfZmllbGRfMjQ2WywgY29sU3Vtcyhpcy5uYShtYXJjX2ZpZWxkXzI0NikpICE9IG5yb3cobWFyY19maWVsZF8yNDYpXSAlPiUNCiAgZmlsdGVyKGdyZXBsKCJvcnlnIixYMjQ2KSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgLGAkYmAsYCRuYCxgJHBgKSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoYCRhYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGFgKSwiIixhcy5jaGFyYWN0ZXIoYCRhYCkpLGNvbGxhcHNlID0gIiwgIiksDQogICAgICAgICBgJGJgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYmApLCIiLGFzLmNoYXJhY3RlcihgJGJgKSksY29sbGFwc2UgPSAiIiksDQogICAgICAgICBgJG5gID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkbmApLCIiLGFzLmNoYXJhY3RlcihgJG5gKSksY29sbGFwc2UgPSAiIiksDQogICAgICAgICBgJHBgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkcGApLCIiLGFzLmNoYXJhY3RlcihgJHBgKSksY29sbGFwc2UgPSAiIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICB1bml0ZSgiWDI0NiIsYCRhYDpgJHBgLHNlcCA9ICIgIixuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKFgyNDYgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NiwiICsiLCIgIiksDQogICAgICAgICBYMjQ2ID0gc3RyX3JlbW92ZShYMjQ2LCAiXFxzK1xcL1xcc3swLH0kIiksDQogICAgICAgICBYMjQ2ID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICkoLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFgyNDYpLGFzLmNoYXJhY3RlcihYMjQ2KSkpKSksDQogICAgICAgICBYMjQ2ID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICl7MCwxfSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKXswLDF9KC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSxhcy5jaGFyYWN0ZXIoWDI0NikpKSkpLA0KICAgICAgICAgWDI0NiA9IHN0cl9yZXBsYWNlX2FsbChYMjQ2LCJcXC57M30gXFwuezN9IiwiLi4uICIpLA0KICAgICAgICAgWDI0NiA9IGdzdWIoIiggOiApKC4pIiwiLiBcXFVcXDIiLHBlcmw9VFJVRSxYMjQ2KSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSwgWDI0NikNCn0gZWxzZSB7DQogIG1hcmNfZmllbGRfMjQ2IDwtIG1hcmNfZmllbGRfMjQ2WywgY29sU3Vtcyhpcy5uYShtYXJjX2ZpZWxkXzI0NikpICE9IG5yb3cobWFyY19maWVsZF8yNDYpXSAlPiUNCiAgZmlsdGVyKGdyZXBsKCJvcnlnIixYMjQ2KSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgLGAkYmApICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShgJGFgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksY29sbGFwc2UgPSAiLCAiKSwNCiAgICAgICAgIGAkYmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRiYCksIiIsYXMuY2hhcmFjdGVyKGAkYmApKSxjb2xsYXBzZSA9ICIiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIHVuaXRlKCJYMjQ2IixgJGFgOmAkYmAsc2VwID0gIiAiLG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoWDI0NiA9IHN0cl9yZXBsYWNlX2FsbChYMjQ2LCIgKyIsIiAiKSwNCiAgICAgICAgIFgyNDYgPSBzdHJfcmVtb3ZlKFgyNDYsICJcXHMrXFwvXFxzezAsfSQiKSwNCiAgICAgICAgIFgyNDYgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksYXMuY2hhcmFjdGVyKFgyNDYpKSkpKSwNCiAgICAgICAgIFgyNDYgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKXswLDF9KC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApezAsMX0oLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFgyNDYpLGFzLmNoYXJhY3RlcihYMjQ2KSkpKSksDQogICAgICAgICBYMjQ2ID0gc3RyX3JlcGxhY2VfYWxsKFgyNDYsIlxcLnszfSBcXC57M30iLCIuLi4gIiksDQogICAgICAgICBYMjQ2ID0gZ3N1YigiKCA6ICkoLikiLCIuIFxcVVxcMiIscGVybD1UUlVFLFgyNDYpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLCBYMjQ2KQ0KfQ0KDQojcG9sZSA1MDANCm1hcmNfZmllbGRfNTAwIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNTAwKSU+JQ0KICBmaWx0ZXIoWDUwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDUwMD1zdHJfcmVtb3ZlX2FsbChYNTAwLCJ+IiksDQogICAgICAgICBYNTAwPXN0cl9yZXBsYWNlX2FsbChYNTAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg1MDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDUwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDUwMD1zdHJfcmVtb3ZlX2FsbChYNTAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg1MDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYNTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzUwMDwtY2JpbmQobWFyY19maWVsZF81MDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF81MDAkWDUwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzUwMCRYNTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzUwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzUwMCRYNTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF81MDAkWDUwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF81MDAgPC0gbWFyY19maWVsZF81MDAgJT4lDQogIGZpbHRlcihncmVwbCgib3J5Z1xcLlxcOiIsWDUwMCkpICU+JQ0KICBtdXRhdGUoWDUwMCA9IHN0cl9yZW1vdmUoYCRhYCwiXlR5dFxcLiBvcnlnXFwuOiB8XlR5dFxcLCBvcnlnXFwuOiB8Xi4qP3R5dFxcLiBvcnlnXFwuOiAiKSwNCiAgICAgICAgIFg1MDAgPSBzdHJfcmVtb3ZlKFg1MDAsICJcXHMrXFwvXFxzezAsfSQiKSwNCiAgICAgICAgIFg1MDAgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLFg1MDApLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDUwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFg1MDApLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsWDUwMCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoLikiLFg1MDApLGdzdWIoIihcXFcpKCApKDp8OykoICkoLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFg1MDApLGFzLmNoYXJhY3RlcihYNTAwKSkpKSksDQogICAgICAgICBYNTAwID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYNTAwKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYNTAwKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLFg1MDApLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixYNTAwKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYNTAwKSxhcy5jaGFyYWN0ZXIoWDUwMCkpKSkpLA0KICAgICAgICAgWDUwMCA9IHN0cl9yZXBsYWNlX2FsbChYNTAwLCJcXC57M30gXFwuezN9IiwiLi4uICIpLA0KICAgICAgICAgWDUwMCA9IHN0cl9yZW1vdmUoWDUwMCwgIlxcLiQiKSwNCiAgICAgICAgIFg1MDAgPSBzdHJfcmVtb3ZlKFg1MDAsIigsezAsMX0gezAsMX0pXFxkezR9LiokfCgsIHR8LiBUKXl0LiBvcnlnLiBjeWtsdToiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNTAwKQ0KI3R5dHXFgiBvcnlnaW5hxYJ1DQp6YV90eXR1bF9vcnlnaW5hbHUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8yNDYsYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfNTAwLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBtdXRhdGUoWDUwMCA9IGlmZWxzZShpcy5uYShYNTAwKSxOQSwNCiAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJvcnlnIixYNTAwKSxOQSxhcy5jaGFyYWN0ZXIoWDUwMCkpKSwNCiAgICAgICAgIFg1MDAgPSBpZmVsc2UoIWlzLm5hKFg1MDApJmdyZXBsKCJcXC4gLSAiLFg1MDApLHN0cl9yZXBsYWNlKFg1MDAsIiguKj8pKFxcLiAtIC4qJCkiLCJcXDEiKSxhcy5jaGFyYWN0ZXIoWDUwMCkpLA0KICAgICAgICAgWDUwMCA9IGlmZWxzZSghaXMubmEoWDUwMCkmZ3JlcGwoIk5hIGtzacSFxbxjZSBwc2V1ZCIsWDUwMCksc3RyX3JlcGxhY2UoWDUwMCwiKC4qPykoXFwuIE5hIGtzacSFxbxjZSBwc2V1ZC4qJCkiLCJcXDEiKSxhcy5jaGFyYWN0ZXIoWDUwMCkpLA0KICAgICAgICAgWDUwMCA9IGlmZWxzZSghaXMubmEoWDUwMCkmZ3JlcGwoIlByemVrxYJcXC4gd2ciLFg1MDApLHN0cl9yZXBsYWNlKFg1MDAsIiguKj8pKFxcLiBQcnpla8WCXFwuIHdnLiokKSIsIlxcMSIpLGFzLmNoYXJhY3RlcihYNTAwKSksDQogICAgICAgICBaQV9UWVRVTF9PUllHSU5BTFUgPSBpZmVsc2UoaXMubmEoWDI0NikmaXMubmEoWDUwMCksTkEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKCFpcy5uYShYNTAwKSxhcy5jaGFyYWN0ZXIoWDUwMCksYXMuY2hhcmFjdGVyKFgyNDYpKSksDQogICAgICAgICBaQV9UWVRVTF9PUllHSU5BTFUgPSBzdHJfcmVtb3ZlX2FsbChaQV9UWVRVTF9PUllHSU5BTFUsJ1xcIicpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFpBX1RZVFVMX09SWUdJTkFMVSkNCiM1OiBqxJl6eWsgb3J5Z2luYcWCdQ0KbWFyY19maWVsZF8wNDEgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgwNDEpJT4lDQogIGZpbHRlcihYMDQxIT0iIikgJT4lDQogIG11dGF0ZShYMDQxPXN0cl9yZXBsYWNlX2FsbChYMDQxLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgwNDEiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDA0MSE9IiIpICU+JQ0KICBtdXRhdGUoWDA0MT1zdHJfcmVtb3ZlX2FsbChYMDQxLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgwNDEsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMDQxLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMDQxKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzA0MTwtY2JpbmQobWFyY19maWVsZF8wNDEsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8wNDEkWDA0MSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzA0MSRYMDQxLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzA0MVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzA0MSRYMDQxKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8wNDEkWDA0MSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KemFfamV6eWtfb3J5Z2luYWx1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMDQxICU+JSBzZWxlY3QoWkFfVVdBR0ksWkFfSkVaWUtfT1JZR0lOQUxVID0gYCRhYCksYnk9IlpBX1VXQUdJIikgJT4lDQogIG11dGF0ZShaQV9KRVpZS19PUllHSU5BTFUgPSBzdHJfcmVwbGFjZV9hbGwoWkFfSkVaWUtfT1JZR0lOQUxVLCJcXCRhIiwiLCIpKSAlPiUNCiAgdW5pcXVlKCkNCg0KIzY6IHdzcMOzxYJ0d8OzcmN5DQptYXJjX2ZpZWxkXzcwMCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDcwMCklPiUNCiAgZmlsdGVyKFg3MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg3MDA9c3RyX3JlcGxhY2VfYWxsKFg3MDAsIiguLlxcJGEpIiwifFxcMSIpLA0KICAgICAgICAgWDcwMD1zdHJfcmVwbGFjZV9hbGwoWDcwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNzAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg3MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg3MDA9c3RyX3JlbW92ZV9hbGwoWDcwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNzAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpICU+JQ0KICBmaWx0ZXIoWDcwMCE9IiIpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDcwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzcwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF83MDA8LWNiaW5kKG1hcmNfZmllbGRfNzAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNzAwJFg3MDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF83MDAkWDcwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF83MDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF83MDAkWDcwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNzAwJFg3MDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KQk5fd3Nwb2x0d29yY2EgPC0gbWFyY19maWVsZF83MDAgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxvc29iYSA9IGAkYWAsZnVua2NqYSA9IGAkZWApICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGZ1bmtjamEpKSAlPiUNCiAgbXV0YXRlKG9zb2JhID0gc3RyX3JlbW92ZShvc29iYSwiKD88PVthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoXFwuJCkiKSwNCiAgICAgICAgIE9TX05BWldJU0tPID0gaWZlbHNlKGdyZXBsKCIsIixvc29iYSksc3RyX3JlcGxhY2VfYWxsKG9zb2JhLCIoLio/KSgsICkoLiopIiwiXFwxIiksYXMuY2hhcmFjdGVyKG9zb2JhKSksDQogICAgICAgICBPU19JTUlFID0gaWZlbHNlKGdyZXBsKCIsIixvc29iYSksc3RyX3JlcGxhY2VfYWxsKG9zb2JhLCIoLio/KSgsICkoLiopIiwiXFwzIiksIioiKSwNCiAgICAgICAgIHdzX3Byb3N0eSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfdG9fbG93ZXIob3NvYmEpLCAiXFxXIiwgIiIpLA0KICAgICAgICAgZnVfcHJvc3RhID0gc3RyX3JlcGxhY2VfYWxsKHN0cl90b19sb3dlcihmdW5rY2phKSwgIlxcVyIsICIiKSkgJT4lDQogIGxlZnRfam9pbiguLFBCTF93c3BvbHR3b3JjeSAlPiUgc2VsZWN0KE9TX09TT0JBX0lELE9TX0xJQ1pCQV9aQVBJU09XLG5hendhX3Byb3N0YSksYnk9Yygid3NfcHJvc3R5Ij0ibmF6d2FfcHJvc3RhIikpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLE9TX05BWldJU0tPLE9TX0lNSUUsLU9TX0xJQ1pCQV9aQVBJU09XKQ0KQk5fd3Nwb2x0d29yY2EkaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKEJOX3dzcG9sdHdvcmNhWzE6Ml0pKQ0KQk5fd3Nwb2x0d29yY2EgPC0gQk5fd3Nwb2x0d29yY2FbIWR1cGxpY2F0ZWQoQk5fd3Nwb2x0d29yY2EkaWRfZ3J1cHkpLF0gJT4lDQogIGxlZnRfam9pbiguLFBCTF9mdW5rY2plLGJ5PWMoImZ1X3Byb3N0YSI9Im5hendhIikpICU+JQ0KICBtdXRhdGUoZm9fc3ltYm9sID0gaWZlbHNlKGZvX3N5bWJvbD09Ik5VTEwiLE5BLGFzLmNoYXJhY3Rlcihmb19zeW1ib2wpKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxPU19OQVpXSVNLTyxPU19JTUlFLE9TX09TT0JBX0lELGZvX3N5bWJvbCxmb19uYXp3YSxmdW5rY2phKQ0KDQojdHV0YWogcHJ6ZXN6dWthxIcgWDI0NSBpIHpuYWxlxbrEhyBixYLEmWR5IHdzcMOzxYJ0d8OzcmPDs3cNCm1hcmNfZmllbGRfMjQ1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1KSU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJ+IiksDQogICAgICAgICBYMjQ1PXN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNDUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNDUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjQ1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI0NTwtY2JpbmQobWFyY19maWVsZF8yNDUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNDUkWDI0NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI0NSRYMjQ1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI0NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI0NSRYMjQ1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNDUkWDI0NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF8yNDUgPC0gbWFyY19maWVsZF8yNDUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1Yz1gJGNgKQ0KDQpCTl93c3BvbHR3b3JjYSA8LSBCTl93c3BvbHR3b3JjYSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8yNDUsYnk9IlpBX1VXQUdJIikNCg0KeCA8LSAxOmxlbmd0aHMoQk5fd3Nwb2x0d29yY2FbMV0pDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBCTl93c3BvbHR3b3JjYSRjenlfbmF6d2lza29baV0gPC0gc3RyX2RldGVjdChCTl93c3BvbHR3b3JjYSRYMjQ1Y1tpXSxCTl93c3BvbHR3b3JjYSRPU19OQVpXSVNLT1tpXSkNCiAgQk5fd3Nwb2x0d29yY2EkY3p5X2ltaWVbaV0gPC0gZ3JlcGwoQk5fd3Nwb2x0d29yY2EkT1NfSU1JRVtpXSxCTl93c3BvbHR3b3JjYSRYMjQ1Y1tpXSkNCn0NCg0KQk5fd3Nwb2x0d29yY2EgPC0gQk5fd3Nwb2x0d29yY2EgJT4lDQogIG11dGF0ZShaQV9BRE5PVEFDSkUgPSBpZmVsc2UoY3p5X25hendpc2tvPT1GQUxTRXxjenlfaW1pZT09RkFMU0UscGFzdGUoIlVXQUdBISBLb25mbGlrdCB3IGRhbnljaCBvc29ib3d5Y2ggdyBwb2xhY2ggNzAwIGkgMjQ1LiBQb3LDs3duYWogcG9sYSB3c3DDs8WCdMOzcmPDs3cgdyBmb3JtdWxhcnp1IHogcG9sZW0gQk46ICIsWDI0NWMsc2VwID0gIiIpLE5BKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxPU19OQVpXSVNLTyxPU19JTUlFLE9TX09TT0JBX0lELGZvX3N5bWJvbCxmb19uYXp3YSxmdW5rY2phLFpBX0FETk9UQUNKRSkNCg0KIzc6IG9waXMgd3Nww7PFgnR3w7NyY8Ozdw0Kb3Bpc193c3BvbHR3b3Jjb3cgPC0gQk5fd3Nwb2x0d29yY2EgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxmdW5rY2phLE9TX0lNSUUsT1NfTkFaV0lTS08pICU+JQ0KICBmdWxsX2pvaW4oLixtYXJjX2ZpZWxkXzI0NSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShPU19OQVpXSVNLTyl8KGlzLm5hKE9TX05BWldJU0tPKSZncmVwbCgiZXQgYWxcXC4iLFgyNDVjKSkpICU+JQ0KICBtdXRhdGUoamVzdF9ldF9hbCA9IGdyZXBsKCJldCBhbFxcLiIsWDI0NWMpLA0KICAgICAgICAgT1NfSU1JRSA9IGlmZWxzZShPU19JTUlFPT0iKiIsIiIsYXMuY2hhcmFjdGVyKE9TX0lNSUUpKSwNCiAgICAgICAgIG9waXMgPSBpZmVsc2UoIWlzLm5hKE9TX05BWldJU0tPKSxwYXN0ZShmdW5rY2phLE9TX0lNSUUsIE9TX05BWldJU0tPLCBzZXAgPSAiICIpLCIiKSwNCiAgICAgICAgIG9waXMgPSBzdHJfcmVwbGFjZV9hbGwob3BpcywiICsiLCIgIiksDQogICAgICAgICBvcGlzID0gaWZlbHNlKG9waXM9PSIgIiwiIixhcy5jaGFyYWN0ZXIob3BpcykpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9waXMsamVzdF9ldF9hbCkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKG9waXMgPSBwYXN0ZShvcGlzLGNvbGxhcHNlID0gIiwgIiksDQogICAgICAgICBqZXN0X2V0X2FsID0gcGFzdGUodW5pcXVlKGplc3RfZXRfYWwpLHNlcCA9ICIiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShvcGlzID0gaWZlbHNlKGplc3RfZXRfYWw9PVRSVUUmb3Bpcz09IiIsImV0IGFsLiIsDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShqZXN0X2V0X2FsLHBhc3RlKG9waXMsImV0IGFsLiIsc2VwID0gIiAiKSxvcGlzKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksb3BpcykNCg0KIzcwMA0KbWFyY19maWVsZF83MDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg3MDApJT4lDQogIGZpbHRlcihYNzAwIT0iIikgJT4lDQogIG11dGF0ZShYNzAwPXN0cl9yZXBsYWNlX2FsbChYNzAwLCIoLi5cXCRhKSIsInxcXDEiKSwNCiAgICAgICAgIFg3MDA9c3RyX3JlcGxhY2VfYWxsKFg3MDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDcwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNzAwIT0iIikgJT4lDQogIG11dGF0ZShYNzAwPXN0cl9yZW1vdmVfYWxsKFg3MDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDcwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKSAlPiUNCiAgZmlsdGVyKFg3MDAhPSIiKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg3MDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF83MDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNzAwPC1jYmluZChtYXJjX2ZpZWxkXzcwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzcwMCRYNzAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNzAwJFg3MDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNzAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNzAwJFg3MDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzcwMCRYNzAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzcwMCA8LSBtYXJjX2ZpZWxkXzcwMCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9zb2JhID0gYCRhYCxmdW5rY2phID0gYCRlYCkgJT4lDQogIGZpbHRlcighaXMubmEoZnVua2NqYSkpICU+JQ0KICBtdXRhdGUob3NvYmEgPSBzdHJfcmVtb3ZlKG9zb2JhLCIoPzw9W2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKShcXC4kKSIpLA0KICAgICAgICAgT1NfTkFaV0lTS08gPSBpZmVsc2UoZ3JlcGwoIiwiLG9zb2JhKSxzdHJfcmVwbGFjZV9hbGwob3NvYmEsIiguKj8pKCwgKSguKikiLCJcXDEiKSxhcy5jaGFyYWN0ZXIob3NvYmEpKSwNCiAgICAgICAgIE9TX0lNSUUgPSBpZmVsc2UoZ3JlcGwoIiwiLG9zb2JhKSxzdHJfcmVwbGFjZV9hbGwob3NvYmEsIiguKj8pKCwgKSguKikiLCJcXDMiKSwiKiIpLA0KICAgICAgICAgZnVua2NqYV9kdXphID0gc3RyX3RvX2xvd2VyKGZ1bmtjamEpLA0KICAgICAgICAgb3BpcyA9IHBhc3RlKGZ1bmtjamFfZHV6YSxPU19JTUlFLE9TX05BWldJU0tPLCBzZXAgPSAiICIpLA0KICAgICAgICAgb3Bpc19kdXp5ID0gcGFzdGUoZnVua2NqYSxPU19JTUlFLE9TX05BWldJU0tPLCBzZXAgPSAiICIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9waXMsb3Bpc19kdXp5KSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUob3BpcyA9IHBhc3RlKG9waXMsY29sbGFwc2UgPSAiLiAiKSwNCiAgICAgICAgIG9waXNfZHV6eSA9IHBhc3RlKG9waXNfZHV6eSxjb2xsYXBzZSA9ICIuICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKQ0KDQojb3BpcyB3c3DDs8WCdHfDs3Jjw7N3IHplIHN0cmVmeSBvZHBvd2llZHppYWxub8WbY2kgMjQ1DQptYXJjX2ZpZWxkXzI0NSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NSklPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwifiIpLA0KICAgICAgICAgWDI0NT1zdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMjQ1IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDI0NSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI0NSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNDU8LWNiaW5kKG1hcmNfZmllbGRfMjQ1LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjQ1JFgyNDUgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNDUkWDI0NSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8yNDVbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8yNDUkWDI0NSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMjQ1JFgyNDUpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfMjQ1IDwtIG1hcmNfZmllbGRfMjQ1ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRjYCkNCg0KI3BvcsOzd25hbmllIG9waXN1IHdzcMOzxYJ0d8OzcmPDs3cgeiAyNDUgaSA3MDANCndzcG9sdHdvcmN5IDwtIG1hcmNfZmllbGRfNzAwICU+JQ0KICBmdWxsX2pvaW4oLixtYXJjX2ZpZWxkXzI0NSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgY1NwbGl0KC4sIiRjIixzZXAgPSAiIDsgIixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICAjb2dyYW5pY3phbmllIG9zw7NiIHplIHN0cmVmeSBvZHBvd2llZHppYWxub8WbY2kNCiAgbXV0YXRlKGN6eV9tYWxhID0gZ3JlcGwoIiBbYS16xJnDs8SFxZvFgsW8xbrEh8WEXXxeW2EtesSZw7PEhcWbxYLFvMW6xIfFhF18XFxbW2EtesSZw7PEhcWbxYLFvMW6xIfFhF0iLGAkY2AsaWdub3JlLmNhc2UgPSBGQUxTRSkpICU+JQ0KICBmaWx0ZXIoY3p5X21hbGE9PVRSVUUpICU+JQ0KICBzZWxlY3QoLWN6eV9tYWxhKSAlPiUNCiAgI211dGF0ZShgJGNgID0gZ3N1YigiXihcXFspezAsMX0oW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKSIsIlxcMVxcVVxcMiIscGVybCA9IFRSVUUsYCRjYCkpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShYMjQ1ID0gcGFzdGUoYCRjYCwgY29sbGFwc2UgPSAiLCAiKSkgJT4lDQogIHNlbGVjdCgtYCRjYCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUob3JkZXJfcGJsID0gYXMuY2hhcmFjdGVyKHN0cl9leHRyYWN0X2FsbChvcGlzLCIoPzw9XnwgfFxcW3wtKShbQS1aQcOBw4DDgsODw4TEgsSAw4XEhMOGRcOJw4jDisOLxJrEksSWxJhJw43DjMOOw4/EqsSuSU/Dk8OSw5TDlcOWxZDDmMWSVcOaw5nDm8OcxbDFqsWvWcOdQ8SGxIzDp0TEjsSQxJBHxKLEnkvEtkzFgcS7TsWDw5HFh8WFxYpSxZhTxZrFoMWeU8OfVMWkxabDnsWiOFrFu8W5xb1hLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkiKSksDQogICAgICAgICBvcmRlcl9wYmwgPSBzdHJfcmVwbGFjZV9hbGwob3JkZXJfcGJsLCIoLio/XCIpKC4pKFwiLio/LikiLCAiXFwyIiksDQogICAgICAgICBvcmRlcl9ibiA9IGFzLmNoYXJhY3RlcihzdHJfZXh0cmFjdF9hbGwoWDI0NSwiKD88PV58IHxcXFt8LSkoW0EtWkHDgcOAw4LDg8OExILEgMOFxITDhkXDicOIw4rDi8SaxJLElsSYScONw4zDjsOPxKrErklPw5PDksOUw5XDlsWQw5jFklXDmsOZw5vDnMWwxarFr1nDnUPEhsSMw6dExI7EkMSQR8SixJ5LxLZMxYHEu07Fg8ORxYfFhcWKUsWYU8WaxaDFnlPDn1TFpMWmw57FojhaxbvFucW9YS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pIikpLA0KICAgICAgICAgb3JkZXJfYm4gPSBzdHJfcmVwbGFjZV9hbGwob3JkZXJfYm4sIiguKj9cIikoLikoXCIuKj8uKSIsICJcXDIiKSwNCiAgICAgICAgIFgyNDUgPSBzdHJfcmVtb3ZlKFgyNDUsICJcXC4kIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCAiXFxbIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCAiXFxdIiksDQogICAgICAgICBvcmRlcl9wYmwgPSBzdHJfcmVtb3ZlX2FsbChvcmRlcl9wYmwsICJbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0iKSwNCiAgICAgICAgIG9yZGVyX2JuID0gc3RyX3JlbW92ZV9hbGwob3JkZXJfYm4sICJbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0iKSwNCiAgICAgICAgIHRvX3NhbW8gPSBvcmRlcl9wYmw9PW9yZGVyX2JuLA0KICAgICAgICAgWDI0NSA9IGdzdWIoIiheW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKSguKikiLCJcXFVcXDFcXEVcXDIiLHBlcmwgPSBUUlVFLCBYMjQ1KSkgJT4lDQogIGxlZnRfam9pbiguLHphX2plenlrX29yeWdpbmFsdSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKGN6eV9wbCA9IGdyZXBsKCJwb2wiLFpBX0pFWllLX09SWUdJTkFMVSl8aXMubmEoWkFfSkVaWUtfT1JZR0lOQUxVKSwNCiAgICAgICAgIGRlY3l6amEgPSBpZmVsc2UodG9fc2Ftbz09RkFMU0V8Y3p5X3BsPT1GQUxTRSxGQUxTRSxUUlVFKSkNCg0KemFfb3Bpc193c3BvbHR3b3Jjb3cgPC0gd3Nwb2x0d29yY3kgJT4lDQogIG11dGF0ZSh6YV9vcGlzX3dzcG9sdHdvcmNvdyA9IGlmZWxzZShkZWN5emphPT1UUlVFLGFzLmNoYXJhY3RlcihYMjQ1KSxwYXN0ZShYMjQ1LG9waXNfZHV6eSxzZXAgPSAiIyIpKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxvcGlzX2R1enksemFfb3Bpc193c3BvbHR3b3Jjb3cpICU+JQ0KICBjU3BsaXQoLiwiemFfb3Bpc193c3BvbHR3b3Jjb3ciLHNlcCA9ICIjIixkaXJlY3Rpb24gPSAid2lkZSIpICU+JQ0KICBtdXRhdGUoemFfb3Bpc193c3BvbHR3b3Jjb3dfMiA9IGlmZWxzZShpcy5uYSh6YV9vcGlzX3dzcG9sdHdvcmNvd18yKSwnJyxhcy5jaGFyYWN0ZXIoemFfb3Bpc193c3BvbHR3b3Jjb3dfMikpLA0KICAgICAgICAgdG9fc2FtbyA9IHphX29waXNfd3Nwb2x0d29yY293XzE9PXphX29waXNfd3Nwb2x0d29yY293XzIpICU+JQ0KICBmaWx0ZXIodG9fc2Ftbz09RkFMU0UpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZSh6YV9vcGlzX3dzcG9sdHdvcmNvdyA9IHBhc3RlKHphX29waXNfd3Nwb2x0d29yY293XzEsemFfb3Bpc193c3BvbHR3b3Jjb3dfMixzZXAgPSAiIyIpLA0KICAgICAgICAgemFfb3Bpc193c3BvbHR3b3Jjb3cgPSBzdHJfcmVtb3ZlX2FsbCh6YV9vcGlzX3dzcG9sdHdvcmNvdywiXFwjJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLHphX29waXNfd3Nwb2x0d29yY293KQ0KDQpvcGlzX3dzcG9sdHdvcmNvdyA8LSBvcGlzX3dzcG9sdHdvcmNvdyAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgemFfb3Bpc193c3BvbHR3b3Jjb3ckWkFfVVdBR0kpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKG9waXMpKSAlPiUNCiAgcmVuYW1lKHphX29waXNfd3Nwb2x0d29yY293ID0gb3BpcykNCg0KemFfb3Bpc193c3BvbHR3b3Jjb3cgPC0gemFfb3Bpc193c3BvbHR3b3Jjb3cgJT4lDQogIGJpbmRfcm93cyguLG9waXNfd3Nwb2x0d29yY293KSAlPiUNCiAgcmlnaHRfam9pbiguLGRhdGEgJT4lIHNlbGVjdChaQV9VV0FHSSksYnk9IlpBX1VXQUdJIikNCg0KIzggd3lkYW5pZQ0KbWFyY19maWVsZF8yNTAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNTApJT4lDQogIGZpbHRlcihYMjUwIT0iIikgJT4lDQogIG11dGF0ZShYMjUwPXN0cl9yZXBsYWNlX2FsbChYMjUwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNTAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI1MCE9IiIpICU+JQ0KICBtdXRhdGUoWDI1MD1zdHJfcmVtb3ZlX2FsbChYMjUwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNTAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjUwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjUwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI1MDwtY2JpbmQobWFyY19maWVsZF8yNTAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNTAkWDI1MCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI1MCRYMjUwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI1MFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI1MCRYMjUwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNTAkWDI1MCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQp6YV93eWRhbmllIDwtIG1hcmNfZmllbGRfMjUwICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIHd5ZGFuaWUgPSBgJGFgKSAlPiUNCiAgbXV0YXRlKHd5ZGFuaWUgPSBzdHJfcmVtb3ZlKHd5ZGFuaWUsIiBcXC8kIikpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojOTogaW5zdHl0dWNqYSBzcHJhd2N6YQ0KbWFyY19maWVsZF8yNDUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIn4iKSwNCiAgICAgICAgIFgyNDU9c3RyX3JlcGxhY2VfYWxsKFgyNDUsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDI0NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8yNDUpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMjQ1PC1jYmluZChtYXJjX2ZpZWxkXzI0NSxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzI0NSRYMjQ1IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMjQ1JFgyNDUsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMjQ1WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMjQ1JFgyNDUpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzI0NSRYMjQ1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCnphX2luc3R5dHVjamEgPC0gbWFyY19maWVsZF8yNDUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1Yz1gJGNgKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShYMjQ1YykpICU+JQ0KICBtdXRhdGUoaW5zdHl0dWNqYSA9IGlmZWxzZShncmVwbCgiXFw7IixYMjQ1Yyksc3RyX3JlcGxhY2VfYWxsKFgyNDVjLCAiKC4qPykoXFw7KD8hLipcXDspKSggKSsoLio/JCkiLCJcXDQiKSwiIikpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93c3BvbHR3b3JjYSxieT0iWkFfVVdBR0kiKQ0KDQp4IDwtIDE6bGVuZ3Rocyh6YV9pbnN0eXR1Y2phWzFdKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgemFfaW5zdHl0dWNqYSRjenlfbmF6d2lza29baV0gPC0gZ3JlcGwoemFfaW5zdHl0dWNqYSRPU19OQVpXSVNLT1tpXSx6YV9pbnN0eXR1Y2phJFgyNDVjW2ldKQ0KICB6YV9pbnN0eXR1Y2phJGN6eV9pbWllW2ldIDwtIGdyZXBsKHphX2luc3R5dHVjamEkT1NfSU1JRVtpXSx6YV9pbnN0eXR1Y2phJFgyNDVjW2ldKQ0KfQ0KDQp6YV9pbnN0eXR1Y2phIDwtIHphX2luc3R5dHVjamEgJT4lDQogIGZpbHRlcihpcy5uYShjenlfbmF6d2lza28pJmlzLm5hKGN6eV9pbWllKSkgJT4lDQogIGZpbHRlcihpbnN0eXR1Y2phIT0iIikgJT4lDQogIGZpbHRlcighZ3JlcGwoIl5cXFtbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl18XlthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSIsaW5zdHl0dWNqYSkpICU+JQ0KICBtdXRhdGUoaW5zdHl0dWNqYSA9IHN0cl9yZW1vdmUoaW5zdHl0dWNqYSwiXFwuJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGluc3R5dHVjamEpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojMTA6IHd5ZGF3bmljdHdvDQpCTl93eWRhd25pY3R3byA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIFgyNjApICU+JQ0KICBtdXRhdGUoWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJzXFwublxcLiIsICJiLncuIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJzXFwubFxcLiIsICJiLm0uIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJTXFwubFxcLiIsICJiLm0uIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZW1vdmUoWDI2MCwiXlxcXFwrIiksIA0KICAgICAgICAgcm9rX3d5ZGFuaWEgPSBzdHJfZXh0cmFjdF9hbGwoWDI2MCwgIig/PD1cXCRjKS4qKD89XFwkZSl8KD88PVxcJGMpLioiKSwgDQogICAgICAgICBiZXpfcm9rdSA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCAiLlxcJGMuKiIsICIiKSwgDQogICAgICAgICBpbGVfd3lkYXduaWN0dyA9IHN0cl9jb3VudChiZXpfcm9rdSwgIlxcJGIiKSwNCiAgICAgICAgIGlsZV9taWVqc2MgPSBzdHJfY291bnQoYmV6X3Jva3UsICJcXCRhIiksDQogICAgICAgICBrb2xlam5vc2MgPSBzdHJfcmVwbGFjZV9hbGwoYXMuY2hhcmFjdGVyKHN0cl9leHRyYWN0X2FsbChiZXpfcm9rdSwgIlxcJC4iKSksICJbXmEtel0iLCAiIiksDQogICAgICAgICBiZXpfcm9rdSA9IHN0cl9yZXBsYWNlX2FsbChiZXpfcm9rdSwgIjtcXCRiIiwgIjokYiIpLA0KICAgICAgICAgd3lkYXdfcG9kemllbCA9IGlmZWxzZShpbGVfd3lkYXduaWN0dz5pbGVfbWllanNjfGtvbGVqbm9zYz09ImNhYWJiIiwgc3RyX3JlcGxhY2VfYWxsKGJlel9yb2t1LCAiKFxcJGEpKC4qPykoIDpcXCRiLio/KSggOlxcJGIpIiwgIlxcMVxcMlxcMyA7JGFcXDJcXDQiKSxiZXpfcm9rdSksDQogICAgICAgICB3eWRhd25pY3R3b190ZXN0ID0gc3RyX3JlcGxhY2VfYWxsKHd5ZGF3X3BvZHppZWwsICIoXFwkYikoLio/KSggO1xcJGEpIiwgIlxcMVxcMnxcXDMiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxyb2tfd3lkYW5pYSx3eWRhd25pY3R3b190ZXN0KSAlPiUNCiAgY1NwbGl0KC4sICJ3eWRhd25pY3R3b190ZXN0Iiwgc2VwID0gInwiLCBkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBtdXRhdGUod3lkYXduaWN0d28gPSBzdHJfZXh0cmFjdF9hbGwod3lkYXduaWN0d29fdGVzdCwgIig/PD1cXCRiKSguKikiKSwNCiAgICAgICAgIG1pZWpzY2Vfd3lkYW5pYSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfZXh0cmFjdF9hbGwod3lkYXduaWN0d29fdGVzdCwgIig/PD1cXCRhKSguKikoPz0gezAsMX06IHswLDF9XFwkYil8KD88PVxcJGEpKC4qKSgkKSIpLCIgO1xcJGEiLCAiLCAiKSwNCiAgICAgICAgIG5hendhX3Byb3N0YSA9IHN0cl90b19sb3dlcihzdHJfcmVwbGFjZV9hbGwoc3RyX3JlcGxhY2VfYWxsKHVubGlzdCh3eWRhd25pY3R3b190ZXN0KSwgIlxcJFxcdyIsICIiKSwgIlxcVyIsICIiKSkpICU+JQ0KICBsZWZ0X2pvaW4oLixQQkxfd3lkYXduaWN0d2EsYnk9Im5hendhX3Byb3N0YSIpICU+JQ0KICBtdXRhdGUodG9fc2FtbyA9IHd5ZGF3bmljdHdvPT1XWV9OQVpXQSkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksLXRvX3NhbW8sLVdZX0xJQ1pCQV9aQVBJU09XKQ0KQk5fd3lkYXduaWN0d28kaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKEJOX3d5ZGF3bmljdHdvWzE6M10pKQ0KQk5fd3lkYXduaWN0d28gPC0gQk5fd3lkYXduaWN0d29bIWR1cGxpY2F0ZWQoQk5fd3lkYXduaWN0d28kaWRfZ3J1cHkpLF0gJT4lDQogIG11dGF0ZShXWV9OQVpXQSA9IGlmZWxzZSghaXMubmEoV1lfTkFaV0EpLGFzLmNoYXJhY3RlcihXWV9OQVpXQSksYXMuY2hhcmFjdGVyKHd5ZGF3bmljdHdvKSksDQogICAgICAgICBXWV9NSUFTVE8gPSBpZmVsc2UoIWlzLm5hKFdZX01JQVNUTyksYXMuY2hhcmFjdGVyKFdZX01JQVNUTyksdHJpbShhcy5jaGFyYWN0ZXIobWllanNjZV93eWRhbmlhKSkpLA0KICAgICAgICAgcm9rX3d5ZGFuaWEgPSBzdHJfcmVwbGFjZV9hbGwocm9rX3d5ZGFuaWEsICIoLiopKFxcLikiLCAiXFwxIiksDQogICAgICAgICB6YV9yb2tfd3lkYW5pYSA9IGlmZWxzZShuY2hhcihyb2tfd3lkYW5pYSk9PTQsYXMuY2hhcmFjdGVyKHJva193eWRhbmlhKSxOQSksDQogICAgICAgICBkb19vcGlzdSA9IGlmZWxzZShpcy5uYSh6YV9yb2tfd3lkYW5pYSkscGFzdGUoIlsiLHN0cl9leHRyYWN0KHJva193eWRhbmlhLCJcXGR7NH0iKSwiXSIsc2VwID0gIiIpLCIiKSwNCiAgICAgICAgIFdZX01JQVNUTyA9IGlmZWxzZShzdWJzdHIoV1lfTUlBU1RPLDEsMSk9PSJbIiZzdWJzdHIoV1lfTUlBU1RPLG5jaGFyKFdZX01JQVNUTyksbmNoYXIoV1lfTUlBU1RPKSkhPSJdIiZpcy5uYShXWV9XWURBV05JQ1RXT19JRCkscGFzdGUodHJpbShXWV9NSUFTVE8pLCJdIixzZXAgPSAiIiksYXMuY2hhcmFjdGVyKFdZX01JQVNUTykpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFdZX1dZREFXTklDVFdPX0lELFdZX05BWldBLFdZX01JQVNUTyx6YV9yb2tfd3lkYW5pYSxkb19vcGlzdSkgJT4lIA0KICBtdXRhdGUoV1lfTkFaV0EgPSBpZmVsc2Uoc3RyX2NvdW50KFdZX05BWldBLCAiXFxbIik+c3RyX2NvdW50KFdZX05BWldBLCAiXFxdIiksIHBhc3RlKFdZX05BWldBLCAiXSIsIHNlcCA9ICIiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfY291bnQoV1lfTkFaV0EsICJcXFsiKTxzdHJfY291bnQoV1lfTkFaV0EsICJcXF0iKSwgcGFzdGUoIlsiLCBXWV9OQVpXQSwgc2VwID0gIiIpLCBhcy5jaGFyYWN0ZXIoV1lfTkFaV0EpKSksDQogICAgICAgICBXWV9NSUFTVE8gPSBpZmVsc2Uoc3RyX2NvdW50KFdZX01JQVNUTywgIlxcWyIpPnN0cl9jb3VudChXWV9NSUFTVE8sICJcXF0iKSwgcGFzdGUoV1lfTUlBU1RPLCAiXSIsIHNlcCA9ICIiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfY291bnQoV1lfTUlBU1RPLCAiXFxbIik8c3RyX2NvdW50KFdZX01JQVNUTywgIlxcXSIpLCBwYXN0ZSgiWyIsIFdZX01JQVNUTywgc2VwID0gIiIpLCBhcy5jaGFyYWN0ZXIoV1lfTUlBU1RPKSkpKQ0KDQojMTE6IG9waXMgZml6eWN6bnkga3NpxIXFvGtpDQojcG9sZSAzMDAgZG8gb3Bpc3UgZml6eWN6bmVnbw0KbWFyY19maWVsZF8zMDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgzMDApJT4lDQogIGZpbHRlcihYMzAwIT0iIikgJT4lDQogIG11dGF0ZShYMzAwPXN0cl9yZXBsYWNlX2FsbChYMzAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgzMDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDMwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDMwMD1zdHJfcmVtb3ZlX2FsbChYMzAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgzMDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMzAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMzAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzMwMDwtY2JpbmQobWFyY19maWVsZF8zMDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8zMDAkWDMwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzMwMCRYMzAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzMwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzMwMCRYMzAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8zMDAkWDMwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF8zMDAgPC0gbWFyY19maWVsZF8zMDAgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlbW92ZShgJGFgLCIgXFw7KyR8IFxcOiskIiksDQogICAgICAgICBgJGJgID0gc3RyX3JlbW92ZShgJGJgLCIgXFw7KyR8IFxcOiskIiksDQogICAgICAgICBgJGVgID0gaWZlbHNlKGdyZXBsKCJDRC1ST018RFZEfFZDRHxDRCIsYCRlYCkmZ3JlcGwoIlxcKyBkeXNrfHDFgnl0IixgJGVgKSxzdHJfZXh0cmFjdChgJGVgLCIoPzw9XFwrKShkeXNrfHDFgnl0Lio/KShDRC1ST018RFZEfFZDRHxDRCkoXFwpKXswLDF9IiksDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiQ0QtUk9NfERWRHxWQ0R8Q0QiLGAkZWApLHN0cl9leHRyYWN0KGAkZWAsIiheLio/KShDRC1ST018RFZEfFZDRHxDRCkoXFwpKXswLDF9IiksTkEpKSwNCiAgICAgICAgIGAkYWAgPSBpZmVsc2UoaXMubmEoYCRhYCksIiIsYXMuY2hhcmFjdGVyKGAkYWApKSwNCiAgICAgICAgIGAkYmAgPSBpZmVsc2UoaXMubmEoYCRiYCksIiIsYXMuY2hhcmFjdGVyKGAkYmApKSwNCiAgICAgICAgIGAkZWAgPSBpZmVsc2UoaXMubmEoYCRlYCksIiIsYXMuY2hhcmFjdGVyKGAkZWApKSkNCiNwb2xlIDUwMCBkbyBvcGlzdSBmaXp5Y3puZWdvDQptYXJjX2ZpZWxkXzUwMCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDUwMCklPiUNCiAgZmlsdGVyKFg1MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg1MDA9c3RyX3JlcGxhY2VfYWxsKFg1MDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDUwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNTAwIT0iIikgJT4lDQogIG11dGF0ZShYNTAwPXN0cl9yZW1vdmVfYWxsKFg1MDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDUwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg1MDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF81MDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNTAwPC1jYmluZChtYXJjX2ZpZWxkXzUwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzUwMCRYNTAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNTAwJFg1MDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNTAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNTAwJFg1MDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzUwMCRYNTAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzUwMCA8LSBtYXJjX2ZpZWxkXzUwMCAlPiUNCiAgbXV0YXRlKGAkYWAgPSBpZmVsc2UoZ3JlcGwoIm9yeWcoXFwufFxcLCkiLFg1MDApJmdyZXBsKCJwc2V1ZHxuYXp3YSIsWDUwMCxpZ25vcmUuY2FzZSA9IFRSVUUpLHN0cl9yZXBsYWNlKGAkYWAsIiheLio/KShcXC4gKShcXHB7THV9LiokKSIsIlxcMyIpLGFzLmNoYXJhY3RlcihgJGFgKSkpICU+JSANCiAgZmlsdGVyKCFncmVwbCgib3J5ZyhcXC58XFwsKSIsYCRhYCkmZ3JlcGwoInBzZXVkfG5hendhfGRvdHljenxwb2wiLGAkYWAsaWdub3JlLmNhc2UgPSBUUlVFKSkgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlbW92ZShgJGFgLCIgXFw7KyR8IFxcOiskIikpDQoNCiNwb2xlIDU0NiBkbyBvcGlzdSBmaXp5Y3puZWdvDQptYXJjX2ZpZWxkXzU0NiA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDU0NiklPiUNCiAgZmlsdGVyKFg1NDYhPSIiKSAlPiUNCiAgbXV0YXRlKFg1NDY9c3RyX3JlcGxhY2VfYWxsKFg1NDYsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDU0NiIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNTQ2IT0iIikgJT4lDQogIG11dGF0ZShYNTQ2PXN0cl9yZW1vdmVfYWxsKFg1NDYsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDU0NiwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg1NDYsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF81NDYpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNTQ2PC1jYmluZChtYXJjX2ZpZWxkXzU0NixlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzU0NiRYNTQ2IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNTQ2JFg1NDYsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNTQ2WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNTQ2JFg1NDYpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzU0NiRYNTQ2KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzU0NiA8LSBtYXJjX2ZpZWxkXzU0NiAlPiUNCiAgbXV0YXRlKGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIiBcXDsrJHwgXFw6KyQiKSkNCg0KI3BvbGUgNTAxIGRvIG9waXN1IGZpenljem5lZ28NCm1hcmNfZmllbGRfNTAxIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNTAxKSU+JQ0KICBmaWx0ZXIoWDUwMSE9IiIpICU+JQ0KICBtdXRhdGUoWDUwMT1zdHJfcmVwbGFjZV9hbGwoWDUwMSwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNTAxIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg1MDEhPSIiKSAlPiUNCiAgbXV0YXRlKFg1MDE9c3RyX3JlbW92ZV9hbGwoWDUwMSwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNTAxLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDUwMSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzUwMSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF81MDE8LWNiaW5kKG1hcmNfZmllbGRfNTAxLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNTAxJFg1MDEgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF81MDEkWDUwMSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF81MDFbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF81MDEkWDUwMSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNTAxJFg1MDEpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfNTAxIDwtIG1hcmNfZmllbGRfNTAxICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIGAkYWApDQoNCnphX29waXNfa3MgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3lkYXduaWN0d28gJT4lIHNlbGVjdChaQV9VV0FHSSxkb19vcGlzdSksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMzAwICU+JSBzZWxlY3QoWkFfVVdBR0ksWDMwMGE9YCRhYCxYMzAwYj1gJGJgLFgzMDBlPWAkZWApLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzUwMCAlPiUgc2VsZWN0KFpBX1VXQUdJLFg1MDBhPWAkYWApLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzU0NiAlPiUgc2VsZWN0KFpBX1VXQUdJLFg1NDZhPWAkYWApLGJ5PSJaQV9VV0FHSSIpICU+JSANCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF81MDEgJT4lIHNlbGVjdChaQV9VV0FHSSxYNTAxYT1gJGFgKSxieT0iWkFfVVdBR0kiKQ0KemFfb3Bpc19rc1tpcy5uYSh6YV9vcGlzX2tzKV0gIDwtICIiDQp6YV9vcGlzX2tzIDwtIHphX29waXNfa3MgJT4lDQogIG11dGF0ZSh6YV9vcGlzX2tzID0gcGFzdGUoaWZlbHNlKGRvX29waXN1IT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoZG9fb3Bpc3UpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDMwMGEhPSIiLHBhc3RlKGFzLmNoYXJhY3RlcihYMzAwYSksIiwgIixzZXAgPSAiIiksIiIpLGlmZWxzZShYMzAwYiE9IiIscGFzdGUoYXMuY2hhcmFjdGVyKFgzMDBiKSwiLCAiLHNlcCA9ICIiKSwiIiksaWZlbHNlKFgzMDBlIT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoWDMwMGUpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDUwMGEhPSIiLHBhc3RlKGFzLmNoYXJhY3RlcihYNTAwYSksIiwgIixzZXAgPSAiIiksIiIpLGlmZWxzZShYNTQ2YSE9IiIsYXMuY2hhcmFjdGVyKFg1NDZhKSwiIiksaWZlbHNlKFg1MDFhIT0iIixhcy5jaGFyYWN0ZXIoWDUwMWEpLCIiKSxzZXAgPSAiIiksDQogICAgICAgICB6YV9vcGlzX2tzID0gc3RyX3JlbW92ZSh6YV9vcGlzX2tzLCIoLCApKyQiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSx6YV9vcGlzX2tzKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksLW5jaGFyKHphX29waXNfa3MpKQ0KemFfb3Bpc19rcyRpZF9ncnVweSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQoemFfb3Bpc19rc1sxXSkpDQp6YV9vcGlzX2tzIDwtIHphX29waXNfa3NbIWR1cGxpY2F0ZWQoemFfb3Bpc19rcyRpZF9ncnVweSksXSAlPiUNCiAgc2VsZWN0KC1pZF9ncnVweSkNCg0KIzEyOiBzZXJpYSB3eWRhd25pY3phDQptYXJjX2ZpZWxkXzQ5MCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDQ5MCxYODAwLFg4MzApICU+JQ0KICBtdXRhdGUoWDQ5MCA9IGlmZWxzZShncmVwbCgiVVxcKyIsWDQ5MCksYXMuY2hhcmFjdGVyKFg4MzApLGFzLmNoYXJhY3RlcihYNDkwKSkpICU+JQ0KICBtdXRhdGUoWDgwMCA9IGlmZWxzZShYNDkwIT0iIiwiIixhcy5jaGFyYWN0ZXIoWDgwMCkpLA0KICAgICAgICAgWDgzMCA9IGlmZWxzZShYNDkwIT0iIiwiIixhcy5jaGFyYWN0ZXIoWDgzMCkpLA0KICAgICAgICAgWDgwMCA9IHN0cl9yZXBsYWNlKFg4MDAsIihcXCRhKSguKikoXFwkdCkiLCJcXDEiKSwNCiAgICAgICAgIFg0OTAgPSBpZmVsc2UoWDQ5MD09IiImWDgzMCE9IiIsYXMuY2hhcmFjdGVyKFg4MzApLA0KICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoWDQ5MD09IiImWDgwMCE9IiIsYXMuY2hhcmFjdGVyKFg4MDApLGFzLmNoYXJhY3RlcihYNDkwKSkpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg0OTApICU+JQ0KICBmaWx0ZXIoWDQ5MCE9IiIpICU+JQ0KICBtdXRhdGUoWDQ5MD1zdHJfcmVwbGFjZV9hbGwoWDQ5MCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNDkwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg0OTAhPSIiKSAlPiUNCiAgbXV0YXRlKFg0OTA9c3RyX3JlbW92ZV9hbGwoWDQ5MCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNDkwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDQ5MCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzQ5MClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF80OTA8LWNiaW5kKG1hcmNfZmllbGRfNDkwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNDkwJFg0OTAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF80OTAkWDQ5MCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF80OTBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF80OTAkWDQ5MCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNDkwJFg0OTApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCnphX3NlcmlhX3d5ZGF3bmljemEgPC0gbWFyY19maWVsZF80OTAgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlcGxhY2VfYWxsKGAkYWAsIig9KShcXCRhKSIsIlxcMSAiKSwNCiAgICAgICAgIGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIiBcXDsrJHwgXFw6KyQiKSwNCiAgICAgICAgIGAkdmAgPSBpZmVsc2UoaXMubmEoYCR2YCksIiIsYXMuY2hhcmFjdGVyKGAkdmApKSkgJT4lDQogIGZpbHRlcighaXMubmEoYCRhYCkpICU+JQ0KICBtdXRhdGUoc2VyaWEgPSBzdHJfcmVtb3ZlKHBhc3RlKCIoIixgJGFgLCI7ICIsYCR2YCwiKSIsc2VwID0gIiIpLCI7ICg/PVxcKSQpIiksDQogICAgICAgICBzZXJpYSA9IGdzdWIoIiggOiApKC4pIiwiLiBcXFVcXDIiLHBlcmw9VFJVRSxzZXJpYSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksc2VyaWEpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShzZXJpYSA9IHBhc3RlKHNlcmlhLGNvbGxhcHNlID0gIiAiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShzZXJpYSA9IHN0cl9yZXBsYWNlX2FsbChzZXJpYSwiXFwkLiIsIjsgIikpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojMTM6IHRvbXkNCnphX3RvbXkgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKHphX3RvbXkgPSBOQSkNCg0KIzE0OiBhZG5vdGFjamUNCnphX2Fkbm90YWNqZSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl9hdXRvciAlPiUgc2VsZWN0KFpBX1VXQUdJLFpBX0FETk9UQUNKRSksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLEJOX3dzcG9sdHdvcmNhICU+JSBzZWxlY3QoWkFfVVdBR0ksWkFfQUROT1RBQ0pFKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKFpBX0FETk9UQUNKRSA9IHBhc3RlKGlmZWxzZShpcy5uYShaQV9BRE5PVEFDSkUueCksIiIscGFzdGUoYXMuY2hhcmFjdGVyKFpBX0FETk9UQUNKRS54KSwiIyAiLHNlcCA9ICIiKSksaWZlbHNlKGlzLm5hKFpBX0FETk9UQUNKRS55KSwiIixhcy5jaGFyYWN0ZXIoWkFfQUROT1RBQ0pFLnkpKSxzZXAgPSAiIiksDQogICAgICAgICBaQV9BRE5PVEFDSkUgPSBzdHJfcmVtb3ZlKFpBX0FETk9UQUNKRSwiKCMgKSskIikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWkFfQUROT1RBQ0pFKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksLW5jaGFyKFpBX0FETk9UQUNKRSkpDQp6YV9hZG5vdGFjamUkaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKHphX2Fkbm90YWNqZVsxXSkpDQp6YV9hZG5vdGFjamUgPC0gemFfYWRub3RhY2plWyFkdXBsaWNhdGVkKHphX2Fkbm90YWNqZSRpZF9ncnVweSksXSAlPiUNCiAgc2VsZWN0KC1pZF9ncnVweSkNCg0KIzE1OiBCTl9VUkwNCkJOX1VSTCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksQk5fVVJMKQ0KDQojd3lyw7N3bmFuaWUgbGljemJ5IHdpZXJzenkgZG8gbGljemJ5IHdpZXJzenkgb2JpZWt0dSBkYXRhDQpCTl9hdXRvciA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl9hdXRvciAlPiUgc2VsZWN0KFpBX1VXQUdJLEFNX0FVVE9SX0lELEFNX05BWldJU0tPLEFNX0lNSUUpLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBkZHBseSguLCAuKFpBX1VXQUdJKSwgc3VtbWFyaXplLCBBTV9BVVRPUl9JRCA9IHBhc3RlKEFNX0FVVE9SX0lELCBjb2xsYXBzZT0ifCIpLCBBTV9OQVpXSVNLTyA9IHBhc3RlKEFNX05BWldJU0tPLCBjb2xsYXBzZT0ifCIpLCBBTV9JTUlFID0gcGFzdGUoQU1fSU1JRSwgY29sbGFwc2U9InwiKSkNCkJOX3dzcG9sdHdvcmNhIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLEJOX3dzcG9sdHdvcmNhICU+JSBzZWxlY3QoWkFfVVdBR0ksT1NfT1NPQkFfSUQsT1NfTkFaV0lTS08sT1NfSU1JRSxmb19zeW1ib2wpLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBkZHBseSguLCAuKFpBX1VXQUdJKSwgc3VtbWFyaXplLCBPU19PU09CQV9JRCA9IHBhc3RlKE9TX09TT0JBX0lELCBjb2xsYXBzZT0ifCIpLCBPU19OQVpXSVNLTyA9IHBhc3RlKE9TX05BWldJU0tPLCBjb2xsYXBzZT0ifCIpLCBPU19JTUlFID0gcGFzdGUoT1NfSU1JRSwgY29sbGFwc2U9InwiKSwgZm9fc3ltYm9sID0gcGFzdGUoZm9fc3ltYm9sLCBjb2xsYXBzZT0ifCIpKSAlPiUNCiAgbXV0YXRlKGZvX3N5bWJvbCA9IGlmZWxzZShmb19zeW1ib2w9PSJOVUxMIiwiTkEiLGFzLmNoYXJhY3Rlcihmb19zeW1ib2wpKSkNCkJOX3d5ZGF3bmljdHdvIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLEJOX3d5ZGF3bmljdHdvICU+JSBzZWxlY3QoWkFfVVdBR0ksV1lfV1lEQVdOSUNUV09fSUQsV1lfTkFaV0EsV1lfTUlBU1RPLHphX3Jva193eWRhbmlhKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgZGRwbHkoLiwgLihaQV9VV0FHSSksIHN1bW1hcml6ZSwgV1lfV1lEQVdOSUNUV09fSUQgPSBwYXN0ZShXWV9XWURBV05JQ1RXT19JRCwgY29sbGFwc2U9InwiKSwgV1lfTkFaV0EgPSBwYXN0ZShXWV9OQVpXQSwgY29sbGFwc2U9InwiKSwgV1lfTUlBU1RPID0gcGFzdGUoV1lfTUlBU1RPLCBjb2xsYXBzZT0ifCIpLCB6YV9yb2tfd3lkYW5pYSA9IHBhc3RlKHVuaXF1ZSh6YV9yb2tfd3lkYW5pYSksIGNvbGxhcHNlPSJ8IikpICU+JQ0KICBtdXRhdGUoemFfcm9rX3d5ZGFuaWEgPSBpZmVsc2UoemFfcm9rX3d5ZGFuaWE9PSJOQSIsIiIsYXMuaW50ZWdlcih6YV9yb2tfd3lkYW5pYSkpKQ0KDQojcG/FgsSFY3plbmllIHdzenlzdGtpY2ggZWxlbWVudMOzdyB3IGplZG7EhSB0YWJlbMSZDQprb2xlam5vc2MgPC0gZGF0YS5mcmFtZShrb2xlam5vc2M9YygiWkFfVVdBR0kiLCJSWl9OQVpXQSIsIlpBX1JPX1JPSyIsIlpBX1RZUEUiLCJSWl9ST0RaQUpfSUQiLCJEWl9OQVpXQSIsIkRaX0RaSUFMX0lEIiwiVFdfVFdPUkNBX0lEIiwiQU1fQVVUT1JfSUQiLCJBTV9OQVpXSVNLTyIsIkFNX0lNSUUiLCJaQV9UWVRVTCIsIlpBX1RZVFVMX09SWUdJTkFMVSIsIlpBX0pFWllLX09SWUdJTkFMVSIsIk9TX09TT0JBX0lEIiwiT1NfTkFaV0lTS08iLCJPU19JTUlFIiwiZm9fc3ltYm9sIiwiemFfb3Bpc193c3BvbHR3b3Jjb3ciLCJ3eWRhbmllIiwiemFfdG9teSIsImluc3R5dHVjamEiLCJXWV9XWURBV05JQ1RXT19JRCIsIldZX01JQVNUTyIsIldZX05BWldBIiwiemFfcm9rX3d5ZGFuaWEiLCJ6YV9vcGlzX2tzIiwic2VyaWEiLCJUV19OQVpXSVNLTyIsIlRXX0lNSUUiLCJyZWRha3Rvcl9kemlhbHUiLCJaQV9BRE5PVEFDSkUiLCJCTl9VUkwiKSkNCnBvbGFjem9uZSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixwb2xhX3BibCxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl9hdXRvcixieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV90eXR1bCxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV90eXR1bF9vcnlnaW5hbHUsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfamV6eWtfb3J5Z2luYWx1LGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLEJOX3dzcG9sdHdvcmNhLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX29waXNfd3Nwb2x0d29yY293LGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX3d5ZGFuaWUsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfaW5zdHl0dWNqYSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93eWRhd25pY3R3byxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9vcGlzX2tzLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX3NlcmlhX3d5ZGF3bmljemEsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfdG9teSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9hZG5vdGFjamUsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fVVJMLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIHNlbGVjdChhcy52ZWN0b3Ioa29sZWpub3NjJGtvbGVqbm9zYykpDQpjb2xuYW1lcyhwb2xhY3pvbmUpIDwtIGMoInJla29yZF9CTiIsInJ6X25hendhIiwiemFfcm9fcm9rIiwiemFfdHlwZSIsInJ6X3JvZHphal9pZCIsIkRaX05BWldBIiwiRFpfRFpJQUxfSUQiLCJ0d190d29yY2FfaWQiLCJhbV9hdXRvcl9pZCIsImFtX25hendpc2tvIiwiYW1faW1pZSIsInphX3R5dHVsIiwiemFfdHl0dWxfb3J5Z2luYWx1IiwiemFfamV6eWtfb3J5Z2luYWx1Iiwib3Nfb3NvYmFfaWQiLCJvc19uYXp3aXNrbyIsIm9zX2ltaWUiLCJmb19zeW1ib2wiLCJ6YV9vcGlzX3dzcG9sdHdvcmNvdyIsInphX3d5ZGFuaWUiLCJ6YV90b215IiwiemFfaW5zdHl0dWNqYSIsInd5X3d5ZGF3bmljdHdvX2lkIiwid3lfbWllanNjZSIsInd5X25hendhIiwiemFfcm9rX3d5ZGFuaWEiLCJ6YV9vcGlzX2Zpenljem55X2tzaWF6a2kiLCJ6YV9zZXJpYV93eWRhd25pY3phIiwidHdfbmF6d2lza28iLCJ0d19pbWllIiwicHJhY293bmlrIiwiemFfYWRub3RhY2plIiwiQk5fVVJMIikNCg0KI3phc3lnbmFsaXpvd2FuaWUgbmllcG9wcmF3bmVnbyBrb2Rvd2FuaWENCnggPC0gMToobGVuZ3RoKHBvbGFjem9uZSktMikNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgcG9sYWN6b25lJHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoZ3JlcGwoIjxVXFwrKC4uLi4pPiIscG9sYWN6b25lWyxpXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShuY2hhcihwb2xhY3pvbmUkemFfYWRub3RhY2plKSE9MCxwYXN0ZShwb2xhY3pvbmUkemFfYWRub3RhY2plLHBhc3RlKCJVV0FHQSEgQsWCxIVkIGtvZG93YW5pYSB3IHBvbHUgIixhcy5jaGFyYWN0ZXIobmFtZXMocG9sYWN6b25lW2ldKSksIiBabmFqZMW6IGZyYXrEmSBcIj8/P1wiIGkgenJlZGFndWogcG9sZS4iLHNlcCA9ICIiKSxzZXAgPSAiIyAiKSxwYXN0ZSgiVVdBR0EhIELFgsSFZCBrb2Rvd2FuaWEgdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgWm5hamTFuiBmcmF6xJkgXCI/Pz9cIiBpIHpyZWRhZ3VqIHBvbGUuIixzZXAgPSAiIikpLGFzLmNoYXJhY3Rlcihwb2xhY3pvbmUkemFfYWRub3RhY2plKSkNCiAgcG9sYWN6b25lWyxpXSA8LSBnc3ViKCI8VVxcKyguLi4uKT4iLCAiPz8/IiwgcG9sYWN6b25lWyxpXSkNCn0NCiN6YXN5Z25hbGl6b3dhbmllIG9iZWNub8WbY2kgem5ha3UgJCB3IGt0w7NyeW3FmyB6IHDDs2wNClggPC0gMToobGVuZ3RoKHBvbGFjem9uZSktMikNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgcG9sYWN6b25lJHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoZ3JlcGwoIlxcJCIscG9sYWN6b25lWyxpXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShuY2hhcihwb2xhY3pvbmUkemFfYWRub3RhY2plKT09MCxwYXN0ZSgiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGLFgsSZZG55IHphcGlzIEJOIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIHd5ZHJ1a293YW5vIHpuYWsgXCIkXCIuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxwYXN0ZShwb2xhY3pvbmUkemFfYWRub3RhY2plLHBhc3RlKCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEgYsWCxJlkbnkgemFwaXMgQk4gdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgd3lkcnVrb3dhbm8gem5hayBcIiRcIi4gWnJlZGFndWogdHJlxZvEhyBwb2xhLiIsc2VwID0gIiIpLHNlcCA9ICIjICIpKSxhcy5jaGFyYWN0ZXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSkpDQp9DQojemFzeWduYWxpem93YW5pZSBvYmVjbm/Fm2NpIGZyYXp5ICJjaGFyYWN0ZXIoMCkiIHcga3TDs3J5bcWbIHogcMOzbA0KWCA8LSAxOihsZW5ndGgocG9sYWN6b25lKS0yKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICBwb2xhY3pvbmUkemFfYWRub3RhY2plIDwtIGlmZWxzZShncmVwbCgiY2hhcmFjdGVyXFwoMFxcKSIscG9sYWN6b25lWyxpXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShuY2hhcihwb2xhY3pvbmUkemFfYWRub3RhY2plKT09MCxwYXN0ZSgiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGLFgsSZZG55IHphcGlzIEJOIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIHd5ZHJ1a293YW5vIGZyYXrEmSBcImNoYXJhY3RlcigwKVwiLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIikscGFzdGUocG9sYWN6b25lJHphX2Fkbm90YWNqZSxwYXN0ZSgiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGLFgsSZZG55IHphcGlzIEJOIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIHd5ZHJ1a293YW5vIGZyYXrEmSBcImNoYXJhY3RlcigwKVwiLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIiksc2VwID0gIiMgIikpLGFzLmNoYXJhY3Rlcihwb2xhY3pvbmUkemFfYWRub3RhY2plKSkNCn0NCiN6YXN5Z25hbGl6b3dhbmllIG9iZWNub8WbY2kgem5ha3UgIyB3IG9waXNpZSB3c3DDs8WCdHfDs3Jjw7N3DQpwb2xhY3pvbmUkemFfYWRub3RhY2plIDwtIGlmZWxzZShncmVwbCgiXFwjIixwb2xhY3pvbmUkemFfb3Bpc193c3BvbHR3b3Jjb3cpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobmNoYXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSk9PTAsIlVXQUdBISBaZSB3emdsxJlkdSBuYSBrb25mbGlrdCB3IG9waXNpZSB3c3DDs8WCdHfDs3Jjw7N3IHd5Ymllcnogd8WCYcWbY2l3xIUgd2FydG/Fm8SHIChzdHJlZmEgb2Rwb3dpZWR6aWFsbm/Fm2NpIFwiI1wiIHdzcMOzxYJ0d8OzcmN5IHogcG9sYSA3MDApLiIscGFzdGUocG9sYWN6b25lJHphX2Fkbm90YWNqZSwiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGtvbmZsaWt0IHcgb3Bpc2llIHdzcMOzxYJ0d8OzcmPDs3cgd3liaWVyeiB3xYJhxZtjaXfEhSB3YXJ0b8WbxIcgKHN0cmVmYSBvZHBvd2llZHppYWxub8WbY2kgIyB3c3DDs8WCdHfDs3JjeSB6IHBvbGEgNzAwKS4iLHNlcCA9ICIjICIpKSxhcy5jaGFyYWN0ZXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSkpDQoja29yZWt0YSBhdXRvbWF0eWN6bmVnbyBJT0sNCmF1dG9tYXR5Y3pueV9JT0sgPC0gcG9sYWN6b25lICU+JQ0KICBtdXRhdGUoY3p5X3R5dF9vcnlnID0gKCFncmVwbCgicG9sc2siLERaX05BWldBKSYhaXMubmEoemFfdHl0dWxfb3J5Z2luYWx1KSl8Z3JlcGwoInBvbHNrIixEWl9OQVpXQSkpICU+JQ0KICBmaWx0ZXIoemFfYWRub3RhY2plPT0iIiZhbV9uYXp3aXNrbyE9Ik5BIiYhZ3JlcGwoInBzZXVkfG5henciLHphX29waXNfZml6eWN6bnlfa3NpYXpraSkmIWdyZXBsKCJcXHwiLGFtX25hendpc2tvKSZjenlfdHl0X29yeWc9PVRSVUUsDQogICAgICAgICAhZ3JlcGwoInN6a2ljfGZlbGlldG9ufGxpc3QiLHN0cl9yZXBsYWNlKHphX3R5dHVsLCIoLiopKFxcWy4qJCkiLCJcXDIiKSxpZ25vcmUuY2FzZSA9IFRSVUUpKSAlPiUNCiAgc2VsZWN0KHJla29yZF9CTikgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBmaWx0ZXIocmVrb3JkX0JOICVub3RpbiUgZGF0YSRaQV9VV0FHSVtkYXRhJGN6eV9hdXRvbWF0eWN6bmllPT0ibmllIl0pICU+JQ0KICBtdXRhdGUocG93aW5ub19ieWMgPSAiSU9LIikNCndyaXRlLmNzdjIoYXV0b21hdHljem55X0lPSywgcGFzdGUoIkM6L1VzZXJzLyIsZW1wbG95ZWVfbmFtZSwiL0Rlc2t0b3AvaW1wXyIsaW1wb3J0X3llYXIsIl9hdXRvbWF0eWN6bmVfcG9kbWlvdG93ZS5jc3YiLHNlcCA9ICIiKSwgcm93Lm5hbWVzID0gRiwgbmEgPSAnJywgZmlsZUVuY29kaW5nID0gJ1VURi04JykNCg0Kb3V0IDwtIGNTcGxpdChwb2xhY3pvbmUsIGMoImFtX2F1dG9yX2lkIiwgImFtX25hendpc2tvIiwgImFtX2ltaWUiLCJvc19vc29iYV9pZCIsIm9zX25hendpc2tvIiwgIm9zX2ltaWUiLCAiZm9fc3ltYm9sIiwid3lfd3lkYXduaWN0d29faWQiLCJ3eV9taWVqc2NlIiwid3lfbmF6d2EiKSxzZXAgPSAifCIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgdW5pcXVlKCkNCg0Kb3V0JHJla29yZF9CTiA8LSBpZmVsc2UoaXMubmEob3V0JHJla29yZF9CTiksJycsYXMuY2hhcmFjdGVyKG91dCRyZWtvcmRfQk4pKQ0Kb3V0JHJ6X25hendhIDwtIGlmZWxzZShpcy5uYShvdXQkcnpfbmF6d2EpLCcnLGFzLmNoYXJhY3RlcihvdXQkcnpfbmF6d2EpKQ0Kb3V0JHphX3JvX3JvayA8LSBpZmVsc2UoaXMubmEob3V0JHphX3JvX3JvayksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9yb19yb2spKQ0Kb3V0JHphX3R5cGUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV90eXBlKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3R5cGUpKQ0Kb3V0JHJ6X3JvZHphal9pZCA8LSBpZmVsc2UoaXMubmEob3V0JHJ6X3JvZHphal9pZCksJycsYXMuY2hhcmFjdGVyKG91dCRyel9yb2R6YWpfaWQpKQ0Kb3V0JERaX05BWldBIDwtIGlmZWxzZShpcy5uYShvdXQkRFpfTkFaV0EpLCcnLGFzLmNoYXJhY3RlcihvdXQkRFpfTkFaV0EpKQ0Kb3V0JERaX0RaSUFMX0lEIDwtIGlmZWxzZShpcy5uYShvdXQkRFpfRFpJQUxfSUQpLCcnLGFzLmNoYXJhY3RlcihvdXQkRFpfRFpJQUxfSUQpKQ0Kb3V0JHR3X3R3b3JjYV9pZCA8LSBpZmVsc2UoaXMubmEob3V0JHR3X3R3b3JjYV9pZCksJycsYXMuY2hhcmFjdGVyKG91dCR0d190d29yY2FfaWQpKQ0Kb3V0JGFtX2F1dG9yX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkYW1fYXV0b3JfaWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkYW1fYXV0b3JfaWQpKQ0Kb3V0JGFtX25hendpc2tvIDwtIGlmZWxzZShpcy5uYShvdXQkYW1fbmF6d2lza28pLCcnLGFzLmNoYXJhY3RlcihvdXQkYW1fbmF6d2lza28pKQ0Kb3V0JGFtX2ltaWUgPC0gaWZlbHNlKGlzLm5hKG91dCRhbV9pbWllKSwnJyxhcy5jaGFyYWN0ZXIob3V0JGFtX2ltaWUpKQ0Kb3V0JHphX3R5dHVsIDwtIGlmZWxzZShpcy5uYShvdXQkemFfdHl0dWwpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfdHl0dWwpKQ0Kb3V0JHphX3R5dHVsX29yeWdpbmFsdSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3R5dHVsX29yeWdpbmFsdSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV90eXR1bF9vcnlnaW5hbHUpKQ0Kb3V0JHphX2plenlrX29yeWdpbmFsdSA8LSBpZmVsc2UoaXMubmEob3V0JHphX2plenlrX29yeWdpbmFsdSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9qZXp5a19vcnlnaW5hbHUpKQ0Kb3V0JG9zX29zb2JhX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkb3Nfb3NvYmFfaWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkb3Nfb3NvYmFfaWQpKQ0Kb3V0JG9zX25hendpc2tvIDwtIGlmZWxzZShpcy5uYShvdXQkb3NfbmF6d2lza28pLCcnLGFzLmNoYXJhY3RlcihvdXQkb3NfbmF6d2lza28pKQ0Kb3V0JG9zX2ltaWUgPC0gaWZlbHNlKGlzLm5hKG91dCRvc19pbWllKSwnJyxhcy5jaGFyYWN0ZXIob3V0JG9zX2ltaWUpKQ0Kb3V0JGZvX3N5bWJvbCA8LSBpZmVsc2UoaXMubmEob3V0JGZvX3N5bWJvbCksJycsYXMuY2hhcmFjdGVyKG91dCRmb19zeW1ib2wpKQ0Kb3V0JHphX29waXNfd3Nwb2x0d29yY293IDwtIGlmZWxzZShpcy5uYShvdXQkemFfb3Bpc193c3BvbHR3b3Jjb3cpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfb3Bpc193c3BvbHR3b3Jjb3cpKQ0Kb3V0JHphX3d5ZGFuaWUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV93eWRhbmllKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3d5ZGFuaWUpKQ0Kb3V0JHphX3RvbXkgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV90b215KSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3RvbXkpKQ0Kb3V0JHphX2luc3R5dHVjamEgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9pbnN0eXR1Y2phKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX2luc3R5dHVjamEpKQ0Kb3V0JHd5X3d5ZGF3bmljdHdvX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkd3lfd3lkYXduaWN0d29faWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkd3lfd3lkYXduaWN0d29faWQpKQ0Kb3V0JHd5X21pZWpzY2UgPC0gaWZlbHNlKGlzLm5hKG91dCR3eV9taWVqc2NlKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHd5X21pZWpzY2UpKQ0Kb3V0JHd5X25hendhIDwtIGlmZWxzZShpcy5uYShvdXQkd3lfbmF6d2EpLCcnLGFzLmNoYXJhY3RlcihvdXQkd3lfbmF6d2EpKQ0Kb3V0JHphX3Jva193eWRhbmlhIDwtIGlmZWxzZShpcy5uYShvdXQkemFfcm9rX3d5ZGFuaWEpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfcm9rX3d5ZGFuaWEpKQ0Kb3V0JHphX29waXNfZml6eWN6bnlfa3NpYXpraSA8LSBpZmVsc2UoaXMubmEob3V0JHphX29waXNfZml6eWN6bnlfa3NpYXpraSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9vcGlzX2Zpenljem55X2tzaWF6a2kpKQ0Kb3V0JHphX3NlcmlhX3d5ZGF3bmljemEgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9zZXJpYV93eWRhd25pY3phKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3NlcmlhX3d5ZGF3bmljemEpKQ0Kb3V0JHR3X25hendpc2tvIDwtIGlmZWxzZShpcy5uYShvdXQkdHdfbmF6d2lza28pLCcnLGFzLmNoYXJhY3RlcihvdXQkdHdfbmF6d2lza28pKQ0Kb3V0JHR3X2ltaWUgPC0gaWZlbHNlKGlzLm5hKG91dCR0d19pbWllKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHR3X2ltaWUpKQ0Kb3V0JHByYWNvd25payA8LSBpZmVsc2UoaXMubmEob3V0JHByYWNvd25payksJycsYXMuY2hhcmFjdGVyKG91dCRwcmFjb3duaWspKQ0Kb3V0JHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoaXMubmEob3V0JHphX2Fkbm90YWNqZSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9hZG5vdGFjamUpKQ0Kb3V0JEJOX1VSTCA8LSBpZmVsc2UoaXMubmEob3V0JEJOX1VSTCksJycsYXMuY2hhcmFjdGVyKG91dCRCTl9VUkwpKQ0KDQpvdXQgJSQlICANCiAgICB7IHJla29yZF9CTj09bGFnKHJla29yZF9CTiwpICYgcnpfbmF6d2E9PWxhZyhyel9uYXp3YSwpICYgemFfcm9fcm9rPT1sYWcoemFfcm9fcm9rLCkgJiB6YV90eXBlPT1sYWcoemFfdHlwZSwpICYgcnpfcm9kemFqX2lkPT1sYWcocnpfcm9kemFqX2lkLCkgJiBEWl9OQVpXQT09bGFnKERaX05BWldBLCkgJiBEWl9EWklBTF9JRD09bGFnKERaX0RaSUFMX0lELCkgJiB0d190d29yY2FfaWQ9PWxhZyh0d190d29yY2FfaWQsKSAmIHphX3R5dHVsPT1sYWcoemFfdHl0dWwsKSAmIHphX3R5dHVsX29yeWdpbmFsdT09bGFnKHphX3R5dHVsX29yeWdpbmFsdSwpICYgemFfamV6eWtfb3J5Z2luYWx1PT1sYWcoemFfamV6eWtfb3J5Z2luYWx1LCkgJiB6YV9vcGlzX3dzcG9sdHdvcmNvdz09bGFnKHphX29waXNfd3Nwb2x0d29yY293LCkgJiB6YV93eWRhbmllPT1sYWcoemFfd3lkYW5pZSwpICYgemFfdG9teT09bGFnKHphX3RvbXksKSAmIHphX2luc3R5dHVjamE9PWxhZyh6YV9pbnN0eXR1Y2phLCkgJiB6YV9yb2tfd3lkYW5pYT09bGFnKHphX3Jva193eWRhbmlhLCkgJiB6YV9vcGlzX2Zpenljem55X2tzaWF6a2k9PWxhZyh6YV9vcGlzX2Zpenljem55X2tzaWF6a2ksKSAmIHphX3NlcmlhX3d5ZGF3bmljemE9PWxhZyh6YV9zZXJpYV93eWRhd25pY3phLCkgJiB0d19uYXp3aXNrbz09bGFnKHR3X25hendpc2tvLCkgJiB0d19pbWllPT1sYWcodHdfaW1pZSwpICYgcHJhY293bmlrPT1sYWcocHJhY293bmlrLCkgJiB6YV9hZG5vdGFjamU9PWxhZyh6YV9hZG5vdGFjamUsKSAmIEJOX1VSTD09bGFnKEJOX1VSTCwpfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gb3V0JHNhbWUNCm91dCRzYW1lWzFdIDwtIDANCm91dCRkemllbG9uZSA8LSBwYXN0ZShvdXQkYW1fYXV0b3JfaWQsb3V0JGFtX25hendpc2tvLG91dCRhbV9pbWllLG91dCRvc19vc29iYV9pZCxvdXQkb3NfbmF6d2lza28sb3V0JG9zX2ltaWUsb3V0JGZvX3N5bWJvbCxvdXQkd3lfd3lkYXduaWN0d29faWQsb3V0JHd5X21pZWpzY2Usb3V0JHd5X25hendhLHNlcCA9ICIiKQ0KDQpvdXQgPC0gb3V0ICU+JQ0KICBmaWx0ZXIoIShzYW1lPT0xJmR6aWVsb25lPT0iIikpICU+JQ0KICBzZWxlY3QoMTozMykNCg0Kb3V0ICUkJSAgDQogICAgeyByZWtvcmRfQk49PWxhZyhyZWtvcmRfQk4sKSAmIHJ6X25hendhPT1sYWcocnpfbmF6d2EsKSAmIHphX3JvX3Jvaz09bGFnKHphX3JvX3JvaywpICYgemFfdHlwZT09bGFnKHphX3R5cGUsKSAmIHJ6X3JvZHphal9pZD09bGFnKHJ6X3JvZHphal9pZCwpICYgRFpfTkFaV0E9PWxhZyhEWl9OQVpXQSwpICYgRFpfRFpJQUxfSUQ9PWxhZyhEWl9EWklBTF9JRCwpICYgdHdfdHdvcmNhX2lkPT1sYWcodHdfdHdvcmNhX2lkLCkgJiB6YV90eXR1bD09bGFnKHphX3R5dHVsLCkgJiB6YV90eXR1bF9vcnlnaW5hbHU9PWxhZyh6YV90eXR1bF9vcnlnaW5hbHUsKSAmIHphX2plenlrX29yeWdpbmFsdT09bGFnKHphX2plenlrX29yeWdpbmFsdSwpICYgemFfb3Bpc193c3BvbHR3b3Jjb3c9PWxhZyh6YV9vcGlzX3dzcG9sdHdvcmNvdywpICYgemFfd3lkYW5pZT09bGFnKHphX3d5ZGFuaWUsKSAmIHphX3RvbXk9PWxhZyh6YV90b215LCkgJiB6YV9pbnN0eXR1Y2phPT1sYWcoemFfaW5zdHl0dWNqYSwpICYgemFfcm9rX3d5ZGFuaWE9PWxhZyh6YV9yb2tfd3lkYW5pYSwpICYgemFfb3Bpc19maXp5Y3pueV9rc2lhemtpPT1sYWcoemFfb3Bpc19maXp5Y3pueV9rc2lhemtpLCkgJiB6YV9zZXJpYV93eWRhd25pY3phPT1sYWcoemFfc2VyaWFfd3lkYXduaWN6YSwpICYgdHdfbmF6d2lza289PWxhZyh0d19uYXp3aXNrbywpICYgdHdfaW1pZT09bGFnKHR3X2ltaWUsKSAmIHByYWNvd25paz09bGFnKHByYWNvd25paywpICYgemFfYWRub3RhY2plPT1sYWcoemFfYWRub3RhY2plLCkgJiBCTl9VUkw9PWxhZyhCTl9VUkwsKX0gJT4lIA0KICAgIGFzLm51bWVyaWMoKSAlPiUgDQogICAgey59IC0+IG91dCRzYW1lDQoNCiN1Y2nEmWNpZSB6Ynl0IGTFgnVnaWNoIGNpxIVnw7N3IHpuYWvDs3csIGJ5IHdlc3rFgnkgZG8gb3JhY2xlJ2ENCmRsdWdvc2NpIDwtIGRhdGEuZnJhbWUocG9sZSA9IGMoImFtX25hendpc2tvIiwgImFtX2ltaWUiLCAiemFfdHl0dWwiLCAiemFfdHl0dWxfb3J5Z2luYWx1IiwgInphX2plenlrX29yeWdpbmFsdSIsICJvc19uYXp3aXNrbyIsICJvc19pbWllIiwgInphX29waXNfd3Nwb2x0d29yY293IiwgInphX2luc3R5dHVjamEiLCAid3lfbWllanNjZSIsICJ3eV9uYXp3YSIsICJ6YV9vcGlzX2Zpenljem55X2tzaWF6a2kiLCAiemFfc2VyaWFfd3lkYXduaWN6YSIsICJ0d19uYXp3aXNrbyIsICJ0d19pbWllIiwgInphX2Fkbm90YWNqZSIpLCBsaWN6YmFfem5ha293ID0gYyg1MCw0MCw1MDAsNTAwLDEwMCw1MCw0MCw1MDAsMjU1LDQwLDI1NSwxMDAwLDI1NSwyMDAsNDAsMjAwMCkpDQp4IDwtIG1hdGNoKGRsdWdvc2NpJHBvbGUsbmFtZXMob3V0KSkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgZGx1Z29zYyA8LSBkbHVnb3NjaSRsaWN6YmFfem5ha293W21hdGNoKG5hbWVzKG91dFtpXSksZGx1Z29zY2kkcG9sZSldDQogIG91dCR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGRsdWdvc2M8bmNoYXIoYXMuY2hhcmFjdGVyKG91dFssaV0pKSZvdXQkemFfYWRub3RhY2plIT0iIixwYXN0ZShvdXQkemFfYWRub3RhY2plLHBhc3RlKCJVV0FHQSEgUG9sZSAiLGFzLmNoYXJhY3RlcihuYW1lcyhvdXRbaV0pKSwiIGJ5xYJvIHpieXQgZMWCdWdpZSBpIHpvc3RhxYJvIHByenljacSZdGUuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxzZXAgPSAiIyAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRsdWdvc2M8bmNoYXIoYXMuY2hhcmFjdGVyKG91dFssaV0pKSZvdXQkemFfYWRub3RhY2plPT0iIixwYXN0ZSgiVVdBR0EhIFBvbGUgIixhcy5jaGFyYWN0ZXIobmFtZXMob3V0W2ldKSksIiBiecWCbyB6Ynl0IGTFgnVnaWUgaSB6b3N0YcWCbyBwcnp5Y2nEmXRlLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIiksYXMuY2hhcmFjdGVyKG91dCR6YV9hZG5vdGFjamUpKSkNCiAgDQogIG91dFssaV0gPC0gaWZlbHNlKGRsdWdvc2M8bmNoYXIoYXMuY2hhcmFjdGVyKG91dFssaV0pKSxhcy5jaGFyYWN0ZXIoc3Vic3RyKG91dFssaV0sMSxkbHVnb3NjKSksYXMuY2hhcmFjdGVyKG91dFssaV0pKQ0KfQ0KDQpvdXQkcmVrb3JkX0JOW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkcnpfbmF6d2Fbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9yb19yb2tbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV90eXBlW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkcnpfcm9kemFqX2lkW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkRFpfTkFaV0Fbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCREWl9EWklBTF9JRFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHR3X3R3b3JjYV9pZFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3R5dHVsW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfdHl0dWxfb3J5Z2luYWx1W291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfamV6eWtfb3J5Z2luYWx1W291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfb3Bpc193c3BvbHR3b3Jjb3dbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV93eWRhbmllW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfdG9teVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX2luc3R5dHVjamFbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9yb2tfd3lkYW5pYVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX29waXNfZml6eWN6bnlfa3NpYXpraVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3NlcmlhX3d5ZGF3bmljemFbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR0d19uYXp3aXNrb1tvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHR3X2ltaWVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCRwcmFjb3duaWtbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9hZG5vdGFjamVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCRCTl9VUkxbb3V0JHNhbWUgPT0gMV0gPC0gIiINCg0KI3ByenlwaXNhbmllIGRvIGF1dG9tYXR5Y3puZWdvIE9LIHJlZGFrdG9yYSAiYXV0b21hdCINCm91dCA8LSBvdXQgJT4lDQogIG11dGF0ZShwcmFjb3duaWsgPSBpZmVsc2UocmVrb3JkX0JOICVpbiUgYXV0b21hdHljem55X0lPSyRyZWtvcmRfQk4sIkFVVE9NQVQiLGFzLmNoYXJhY3RlcihwcmFjb3duaWspKSkgJT4lDQogIHNlbGVjdCgxOjMzKQ0KDQojcMSZdGxhIHphcGlzdWrEhWNhIHBvIG9rLiAyMDAwIHdpZXJzenkgeiB1d3pnbMSZZG5pZW5pZW0ga29tcGxldG5vxZtjaSByZWtvcmTDs3cgYmlibGlvZ3JhZmljem55Y2ggcm96cGlzYW55Y2ggbmEga2lsa2Egd2llcnN6eQ0Kb3V0IDwtIG91dCAlPiUNCiAgbXV0YXRlKHBvZHppYWwgPSBpZmVsc2UocmVrb3JkX0JOIT0iIixhcy5jaGFyYWN0ZXIocmVrb3JkX0JOKSxOQSkpICU+JQ0KICBmaWxsKHBvZHppYWwpDQppbGUgPC0gdW5pcXVlKG91dCRwb2R6aWFsKQ0KaWxlIDwtIHNwbGl0KHVuaXF1ZShpbGUpLCBjZWlsaW5nKHNlcV9hbG9uZyh1bmlxdWUoaWxlKSkvMTUwMCkpDQp4IDwtIDE6bGVuZ3RoKGlsZSkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgZmluYWwgPC0gb3V0ICU+JQ0KICAgIGZpbHRlcihwb2R6aWFsICVpbiUgaWxlW1tpXV0pICU+JQ0KICAgIHNlbGVjdCgtcG9kemlhbCkNCiAgd3JpdGUueGxzeChmaW5hbCwgcGFzdGUoIkM6L1VzZXJzLyIsZW1wbG95ZWVfbmFtZSwiL0Rlc2t0b3AvIixpbXBvcnRfeWVhciwiX3BvZG1pb3Rvd2FfZG9faW1wb3J0dSIsaSwiLnhsc3giLHNlcCA9ICIiKSxzaGVldE5hbWUgPSAiZ290b3dlIikNCn0NCmBgYA0KDQpgYGB7ciBrc2nEhcW8a2kgcHJ6ZWRtaW90b3dlfQ0KYm5fb2sgPC0gY2h1bmsxMQ0KZGF0YSA8LSBibl9vayAlPiUNCiAgZmlsdGVyKHJvZHphal9rc2lhemtpPT0icHJ6ZWRtaW90b3dhIikgJT4lDQogIG11dGF0ZShyZWRha3Rvcl9kemlhbHUgPSBwYXN0ZShyZWRha3Rvcl9kemlhbHUsIl9wcnplZG0iLHNlcCA9ICIiKSkNCiN1d29sbmllbmllIGtvbHVtbiB6IGRhbnltaSB6IGJuIGkgcHJ6ZXR3b3J6ZW5pZSBkbyBQQkwNCiMxOiB6YV91d2FnaSwgcnpfbmF6d2EsIHphX3JvX3JvaywgemFfdHlwZSwgcnpfcm9kemFqX2lkLCB0d190d29yY2FfaWQsIHR3X25hendpc2tvLCB0d19pbWllLCBkel9kemlhbF9pZCwgZHpfbmF6d2EsIHJlZGFrdG9yX2R6aWFsdQ0KcG9sYV9wYmwgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLCBSWl9OQVpXQSwgWkFfUk9fUk9LID0gcm9rLCBSWl9ST0RaQUpfSUQsIFRXX1RXT1JDQV9JRCwgVFdfTkFaV0lTS08sIFRXX0lNSUUsIERaX0RaSUFMX0lELCBEWl9OQVpXQSwgcmVkYWt0b3JfZHppYWx1KSAlPiUNCiAgbXV0YXRlKFpBX1RZUEUgPSAiS1MiKQ0KIzI6IGF1dG9yDQpCTl9hdXRvciA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWDEwMCxYMjQ1LFpBX1VXQUdJKQ0KI3BvbGUgMTAwDQptYXJjX2ZpZWxkXzEwMCA8LSBCTl9hdXRvciAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgxMDApJT4lDQogIGZpbHRlcihYMTAwIT0iIikgJT4lDQogIG11dGF0ZShYMTAwPXN0cl9yZXBsYWNlX2FsbChYMTAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgxMDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDEwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDEwMD1zdHJfcmVtb3ZlX2FsbChYMTAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgxMDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoQk5fYXV0b3IkWDEwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzEwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8xMDA8LWNiaW5kKG1hcmNfZmllbGRfMTAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMTAwJFgxMDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8xMDAkWDEwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8xMDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8xMDAkWDEwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMTAwJFgxMDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KI3BvbGUgMjQ1DQptYXJjX2ZpZWxkXzI0NSA8LSBCTl9hdXRvciAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNDUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNDUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoQk5fYXV0b3IkWDI0NSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI0NSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNDU8LWNiaW5kKG1hcmNfZmllbGRfMjQ1LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjQ1JFgyNDUgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNDUkWDI0NSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8yNDVbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8yNDUkWDI0NSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMjQ1JFgyNDUpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KQk5fYXV0b3IgPC0gbWFyY19maWVsZF8xMDAgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgLGAkYmApICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKGAkYWAgPSBpZmVsc2UoIWlzLm5hKGAkYmApLHBhc3RlKGAkYWAsYCRiYCxzZXAgPSAiICIpLGFzLmNoYXJhY3RlcihgJGFgKSkpICU+JQ0KICBtdXRhdGUoYCRhYCA9IHN0cl9yZW1vdmUoYCRhYCwiKD88PVthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoXFwuJCkiKSkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUoQU1fTkFaV0lTS08gPSBpZmVsc2UoZ3JlcGwoIlxcfCIsYCRhYCksIHN0cl9yZXBsYWNlX2FsbChzdHJfcmVtb3ZlX2FsbChgJGFgLCIsIiksIlxcfCIsIiwgIiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIiwiLGAkYWApLHN0cl9yZXBsYWNlX2FsbChgJGFgLCIoLio/KSgsICkoLiopIiwiXFwxIiksYXMuY2hhcmFjdGVyKGAkYWApKSksDQogICAgICAgICBBTV9JTUlFID0gaWZlbHNlKGdyZXBsKCJcXHwiLGAkYWApLCIqIiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIsIixgJGFgKSxzdHJfcmVwbGFjZV9hbGwoYCRhYCwiKC4qPykoLCApKC4qKSIsIlxcMyIpLCIqIikpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLEFNX05BWldJU0tPLEFNX0lNSUUpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzI0NSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLEFNX05BWldJU0tPLEFNX0lNSUUsIFgyNDVjID0gYCRjYCkNCiAgDQp4IDwtIDE6bGVuZ3RocyhCTl9hdXRvclsxXSkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIEJOX2F1dG9yJGN6eV9uYXp3aXNrb1tpXSA8LSBncmVwbChCTl9hdXRvciRBTV9OQVpXSVNLT1tpXSxCTl9hdXRvciRYMjQ1Y1tpXSkNCiAgQk5fYXV0b3IkY3p5X2ltaWVbaV0gPC0gZ3JlcGwoQk5fYXV0b3IkQU1fSU1JRVtpXSxCTl9hdXRvciRYMjQ1Y1tpXSkNCn0NCg0KQk5fYXV0b3IgPC0gQk5fYXV0b3IgJT4lDQogIG11dGF0ZShaQV9BRE5PVEFDSkUgPSBpZmVsc2UoY3p5X25hendpc2tvPT1GQUxTRXxjenlfaW1pZT09RkFMU0UscGFzdGUoIlVXQUdBISBLb25mbGlrdCB3IGRhbnljaCBvc29ib3d5Y2ggdyBwb2xhY2ggMTAwIGkgMjQ1LiBQb3LDs3duYWogcG9sZSBhdXRvciB3IGZvcm11bGFyenUgeiBwb2xlbSBCTjogIixYMjQ1YyxzZXAgPSAiIiksTkEpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLEFNX05BWldJU0tPLEFNX0lNSUUsWkFfQUROT1RBQ0pFKSAlPiUNCiAgbXV0YXRlKG5hendhID0gc3RyX3JlcGxhY2VfYWxsKHN0cl90b19sb3dlcihwYXN0ZShBTV9OQVpXSVNLTyxBTV9JTUlFLCBzZXAgPSAiIikpLCAiXFxXIiwgIiIpKSAlPiUNCiAgbGVmdF9qb2luKC4sUEJMX2F1dG9yenkgJT4lIHNlbGVjdChBTV9BVVRPUl9JRCxBTV9LUllQVE9OSU0sQU1fTElDWkJBX1pBUElTT1csbmF6d2EpICU+JSBmaWx0ZXIoaXMubmEoQU1fS1JZUFRPTklNKSksYnk9Im5hendhIikgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksQU1fTkFaV0lTS08sQU1fSU1JRSwtQU1fTElDWkJBX1pBUElTT1cpDQpCTl9hdXRvciRpZF9ncnVweSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQoQk5fYXV0b3JbMTozXSkpDQpCTl9hdXRvciA8LSBCTl9hdXRvclshZHVwbGljYXRlZChCTl9hdXRvciRpZF9ncnVweSksXSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLEFNX05BWldJU0tPLEFNX0lNSUUsWkFfQUROT1RBQ0pFLEFNX0FVVE9SX0lEKQ0KDQojMzogdHl0dcWCDQojcG9sZSAyNDUNCm1hcmNfZmllbGRfMjQ1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1KSU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJ+IiksDQogICAgICAgICBYMjQ1PXN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNDUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNDUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjQ1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI0NTwtY2JpbmQobWFyY19maWVsZF8yNDUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNDUkWDI0NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI0NSRYMjQ1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI0NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI0NSRYMjQ1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNDUkWDI0NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQp6YV90eXR1bCA8LSBtYXJjX2ZpZWxkXzI0NSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGAkYWAsYCRiYCxgJG5gLGAkcGApICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShgJGFgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksY29sbGFwc2UgPSAiICIpLA0KICAgICAgICAgYCRiYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGJgKSwiIixhcy5jaGFyYWN0ZXIoYCRiYCkpLGNvbGxhcHNlID0gIiAiKSwNCiAgICAgICAgIGAkbmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRuYCksIiIsYXMuY2hhcmFjdGVyKGAkbmApKSxjb2xsYXBzZSA9ICIgIiksDQogICAgICAgICBgJHBgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkcGApLCIiLGFzLmNoYXJhY3RlcihgJHBgKSksY29sbGFwc2UgPSAiICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgdW5pdGUoIlpBX1RZVFVMIixgJGFgOmAkcGAsc2VwID0gIiAiLG5hLnJtID0gVFJVRSkgJT4lDQogIG11dGF0ZShaQV9UWVRVTCA9IHN0cl9yZXBsYWNlX2FsbChaQV9UWVRVTCwiICsiLCIgIiksDQogICAgICAgICBaQV9UWVRVTCA9IHN0cl9yZW1vdmUoWkFfVFlUVUwsICJcXHMrXFwvXFxzezAsfSQiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLGFzLmNoYXJhY3RlcihaQV9UWVRVTCkpKSkpLA0KICAgICAgICAgWkFfVFlUVUwgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWkFfVFlUVUwpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLFpBX1RZVFVMKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxaQV9UWVRVTCksYXMuY2hhcmFjdGVyKFpBX1RZVFVMKSkpKSksDQogICAgICAgICBaQV9UWVRVTCA9IHN0cl9yZXBsYWNlX2FsbChaQV9UWVRVTCwiXFwuezN9IFxcLnszfSIsIi4uLiAiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gc3RyX3JlcGxhY2VfYWxsKFpBX1RZVFVMLCIgOyAiLCIuICIpLA0KICAgICAgICAgWkFfVFlUVUwgPSBnc3ViKCIoIDogKSguKSIsIi4gXFxVXFwyIixwZXJsPVRSVUUsWkFfVFlUVUwpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFpBX1RZVFVMKQ0KDQojNDogdHl0dcWCIG9yeWdpbmHFgnUNCiNwb2xlIDI0Ng0KbWFyY19maWVsZF8yNDYgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDYpJT4lDQogIGZpbHRlcihYMjQ2IT0iIikgJT4lDQogIG11dGF0ZShYMjQ2PXN0cl9yZW1vdmVfYWxsKFgyNDYsIn4iKSwNCiAgICAgICAgIFgyNDY9c3RyX3JlcGxhY2VfYWxsKFgyNDYsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDI0NiIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMjQ2IT0iIikgJT4lDQogIG11dGF0ZShYMjQ2PXN0cl9yZW1vdmVfYWxsKFgyNDYsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NiwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDYsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8yNDYpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMjQ2PC1jYmluZChtYXJjX2ZpZWxkXzI0NixlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzI0NiRYMjQ2IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMjQ2JFgyNDYsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMjQ2WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMjQ2JFgyNDYpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzI0NiRYMjQ2KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCmlmKCIkbiIgJWluJSBjb2xuYW1lcyhtYXJjX2ZpZWxkXzI0NikpIHsNCm1hcmNfZmllbGRfMjQ2IDwtIG1hcmNfZmllbGRfMjQ2WywgY29sU3Vtcyhpcy5uYShtYXJjX2ZpZWxkXzI0NikpICE9IG5yb3cobWFyY19maWVsZF8yNDYpXSAlPiUNCiAgZmlsdGVyKGdyZXBsKCJvcnlnIixYMjQ2KSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgLGAkYmAsYCRuYCxgJHBgKSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoYCRhYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGFgKSwiIixhcy5jaGFyYWN0ZXIoYCRhYCkpLGNvbGxhcHNlID0gIiwgIiksDQogICAgICAgICBgJGJgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYmApLCIiLGFzLmNoYXJhY3RlcihgJGJgKSksY29sbGFwc2UgPSAiIiksDQogICAgICAgICBgJG5gID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkbmApLCIiLGFzLmNoYXJhY3RlcihgJG5gKSksY29sbGFwc2UgPSAiIiksDQogICAgICAgICBgJHBgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkcGApLCIiLGFzLmNoYXJhY3RlcihgJHBgKSksY29sbGFwc2UgPSAiIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICB1bml0ZSgiWDI0NiIsYCRhYDpgJHBgLHNlcCA9ICIgIixuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKFgyNDYgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NiwiICsiLCIgIiksDQogICAgICAgICBYMjQ2ID0gc3RyX3JlbW92ZShYMjQ2LCAiXFxzK1xcL1xcc3swLH0kIiksDQogICAgICAgICBYMjQ2ID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICkoLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFgyNDYpLGFzLmNoYXJhY3RlcihYMjQ2KSkpKSksDQogICAgICAgICBYMjQ2ID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICl7MCwxfSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKXswLDF9KC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSxhcy5jaGFyYWN0ZXIoWDI0NikpKSkpLA0KICAgICAgICAgWDI0NiA9IHN0cl9yZXBsYWNlX2FsbChYMjQ2LCJcXC57M30gXFwuezN9IiwiLi4uICIpLA0KICAgICAgICAgWDI0NiA9IGdzdWIoIiggOiApKC4pIiwiLiBcXFVcXDIiLHBlcmw9VFJVRSxYMjQ2KSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSwgWDI0NikNCn0gZWxzZSB7DQogIG1hcmNfZmllbGRfMjQ2IDwtIG1hcmNfZmllbGRfMjQ2WywgY29sU3Vtcyhpcy5uYShtYXJjX2ZpZWxkXzI0NikpICE9IG5yb3cobWFyY19maWVsZF8yNDYpXSAlPiUNCiAgZmlsdGVyKGdyZXBsKCJvcnlnIixYMjQ2KSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgLGAkYmApICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShgJGFgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksY29sbGFwc2UgPSAiLCAiKSwNCiAgICAgICAgIGAkYmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRiYCksIiIsYXMuY2hhcmFjdGVyKGAkYmApKSxjb2xsYXBzZSA9ICIiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIHVuaXRlKCJYMjQ2IixgJGFgOmAkYmAsc2VwID0gIiAiLG5hLnJtID0gVFJVRSkgJT4lIA0KICBtdXRhdGUoWDI0NiA9IHN0cl9yZXBsYWNlX2FsbChYMjQ2LCIgKyIsIiAiKSwNCiAgICAgICAgIFgyNDYgPSBzdHJfcmVtb3ZlKFgyNDYsICJcXHMrXFwvXFxzezAsfSQiKSwNCiAgICAgICAgIFgyNDYgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksYXMuY2hhcmFjdGVyKFgyNDYpKSkpKSwNCiAgICAgICAgIFgyNDYgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKXswLDF9KC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApezAsMX0oLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFgyNDYpLGFzLmNoYXJhY3RlcihYMjQ2KSkpKSksDQogICAgICAgICBYMjQ2ID0gc3RyX3JlcGxhY2VfYWxsKFgyNDYsIlxcLnszfSBcXC57M30iLCIuLi4gIiksDQogICAgICAgICBYMjQ2ID0gZ3N1YigiKCA6ICkoLikiLCIuIFxcVVxcMiIscGVybD1UUlVFLFgyNDYpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLCBYMjQ2KQ0KfQ0KDQojcG9sZSA1MDANCm1hcmNfZmllbGRfNTAwIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNTAwKSU+JQ0KICBmaWx0ZXIoWDUwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDUwMD1zdHJfcmVtb3ZlX2FsbChYNTAwLCJ+IiksDQogICAgICAgICBYNTAwPXN0cl9yZXBsYWNlX2FsbChYNTAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg1MDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDUwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDUwMD1zdHJfcmVtb3ZlX2FsbChYNTAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg1MDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYNTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzUwMDwtY2JpbmQobWFyY19maWVsZF81MDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF81MDAkWDUwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzUwMCRYNTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzUwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzUwMCRYNTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF81MDAkWDUwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF81MDAgPC0gbWFyY19maWVsZF81MDAgJT4lDQogIGZpbHRlcihncmVwbCgib3J5Z1xcLlxcOiIsWDUwMCkpICU+JQ0KICBtdXRhdGUoWDUwMCA9IHN0cl9yZW1vdmUoYCRhYCwiXlR5dFxcLiBvcnlnXFwuOiB8XlR5dFxcLCBvcnlnXFwuOiB8Xi4qP3R5dFxcLiBvcnlnXFwuOiAiKSwNCiAgICAgICAgIFg1MDAgPSBzdHJfcmVtb3ZlKFg1MDAsICJcXHMrXFwvXFxzezAsfSQiKSwNCiAgICAgICAgIFg1MDAgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLFg1MDApLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDUwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFg1MDApLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsWDUwMCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoLikiLFg1MDApLGdzdWIoIihcXFcpKCApKDp8OykoICkoLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFg1MDApLGFzLmNoYXJhY3RlcihYNTAwKSkpKSksDQogICAgICAgICBYNTAwID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYNTAwKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYNTAwKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLFg1MDApLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixYNTAwKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYNTAwKSxhcy5jaGFyYWN0ZXIoWDUwMCkpKSkpLA0KICAgICAgICAgWDUwMCA9IHN0cl9yZXBsYWNlX2FsbChYNTAwLCJcXC57M30gXFwuezN9IiwiLi4uICIpLA0KICAgICAgICAgWDUwMCA9IHN0cl9yZW1vdmUoWDUwMCwgIlxcLiQiKSwNCiAgICAgICAgIFg1MDAgPSBzdHJfcmVtb3ZlKFg1MDAsIigsezAsMX0gezAsMX0pXFxkezR9LiokfCgsIHR8LiBUKXl0LiBvcnlnLiBjeWtsdToiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNTAwKQ0KI3R5dHXFgiBvcnlnaW5hxYJ1DQp6YV90eXR1bF9vcnlnaW5hbHUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8yNDYsYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfNTAwLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBtdXRhdGUoWDUwMCA9IGlmZWxzZShpcy5uYShYNTAwKSxOQSwNCiAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJvcnlnIixYNTAwKSxOQSxhcy5jaGFyYWN0ZXIoWDUwMCkpKSwNCiAgICAgICAgIFg1MDAgPSBpZmVsc2UoIWlzLm5hKFg1MDApJmdyZXBsKCJcXC4gLSAiLFg1MDApLHN0cl9yZXBsYWNlKFg1MDAsIiguKj8pKFxcLiAtIC4qJCkiLCJcXDEiKSxhcy5jaGFyYWN0ZXIoWDUwMCkpLA0KICAgICAgICAgWDUwMCA9IGlmZWxzZSghaXMubmEoWDUwMCkmZ3JlcGwoIk5hIGtzacSFxbxjZSBwc2V1ZCIsWDUwMCksc3RyX3JlcGxhY2UoWDUwMCwiKC4qPykoXFwuIE5hIGtzacSFxbxjZSBwc2V1ZC4qJCkiLCJcXDEiKSxhcy5jaGFyYWN0ZXIoWDUwMCkpLA0KICAgICAgICAgWDUwMCA9IGlmZWxzZSghaXMubmEoWDUwMCkmZ3JlcGwoIlByemVrxYJcXC4gd2ciLFg1MDApLHN0cl9yZXBsYWNlKFg1MDAsIiguKj8pKFxcLiBQcnpla8WCXFwuIHdnLiokKSIsIlxcMSIpLGFzLmNoYXJhY3RlcihYNTAwKSksDQogICAgICAgICBaQV9UWVRVTF9PUllHSU5BTFUgPSBpZmVsc2UoaXMubmEoWDI0NikmaXMubmEoWDUwMCksTkEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKCFpcy5uYShYNTAwKSxhcy5jaGFyYWN0ZXIoWDUwMCksYXMuY2hhcmFjdGVyKFgyNDYpKSksDQogICAgICAgICBaQV9UWVRVTF9PUllHSU5BTFUgPSBzdHJfcmVtb3ZlX2FsbChaQV9UWVRVTF9PUllHSU5BTFUsJ1xcIicpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFpBX1RZVFVMX09SWUdJTkFMVSkNCiM1OiBqxJl6eWsgb3J5Z2luYcWCdQ0KbWFyY19maWVsZF8wNDEgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgwNDEpJT4lDQogIGZpbHRlcihYMDQxIT0iIikgJT4lDQogIG11dGF0ZShYMDQxPXN0cl9yZXBsYWNlX2FsbChYMDQxLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgwNDEiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDA0MSE9IiIpICU+JQ0KICBtdXRhdGUoWDA0MT1zdHJfcmVtb3ZlX2FsbChYMDQxLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgwNDEsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMDQxLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMDQxKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzA0MTwtY2JpbmQobWFyY19maWVsZF8wNDEsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8wNDEkWDA0MSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzA0MSRYMDQxLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzA0MVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzA0MSRYMDQxKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8wNDEkWDA0MSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KemFfamV6eWtfb3J5Z2luYWx1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMDQxICU+JSBzZWxlY3QoWkFfVVdBR0ksWkFfSkVaWUtfT1JZR0lOQUxVID0gYCRhYCksYnk9IlpBX1VXQUdJIikgJT4lDQogIG11dGF0ZShaQV9KRVpZS19PUllHSU5BTFUgPSBzdHJfcmVwbGFjZV9hbGwoWkFfSkVaWUtfT1JZR0lOQUxVLCJcXCRhIiwiLCIpKSAlPiUNCiAgdW5pcXVlKCkNCg0KIzY6IHdzcMOzxYJ0d8OzcmN5DQptYXJjX2ZpZWxkXzcwMCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDcwMCklPiUNCiAgZmlsdGVyKFg3MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg3MDA9c3RyX3JlcGxhY2VfYWxsKFg3MDAsIiguLlxcJGEpIiwifFxcMSIpLA0KICAgICAgICAgWDcwMD1zdHJfcmVwbGFjZV9hbGwoWDcwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNzAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg3MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg3MDA9c3RyX3JlbW92ZV9hbGwoWDcwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNzAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpICU+JQ0KICBmaWx0ZXIoWDcwMCE9IiIpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDcwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzcwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF83MDA8LWNiaW5kKG1hcmNfZmllbGRfNzAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNzAwJFg3MDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF83MDAkWDcwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF83MDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF83MDAkWDcwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNzAwJFg3MDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KQk5fd3Nwb2x0d29yY2EgPC0gbWFyY19maWVsZF83MDAgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxvc29iYSA9IGAkYWAsZnVua2NqYSA9IGAkZWApICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGZ1bmtjamEpKSAlPiUNCiAgbXV0YXRlKG9zb2JhID0gc3RyX3JlbW92ZShvc29iYSwiKD88PVthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoXFwuJCkiKSwNCiAgICAgICAgIE9TX05BWldJU0tPID0gaWZlbHNlKGdyZXBsKCIsIixvc29iYSksc3RyX3JlcGxhY2VfYWxsKG9zb2JhLCIoLio/KSgsICkoLiopIiwiXFwxIiksYXMuY2hhcmFjdGVyKG9zb2JhKSksDQogICAgICAgICBPU19JTUlFID0gaWZlbHNlKGdyZXBsKCIsIixvc29iYSksc3RyX3JlcGxhY2VfYWxsKG9zb2JhLCIoLio/KSgsICkoLiopIiwiXFwzIiksIioiKSwNCiAgICAgICAgIHdzX3Byb3N0eSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfdG9fbG93ZXIob3NvYmEpLCAiXFxXIiwgIiIpLA0KICAgICAgICAgZnVfcHJvc3RhID0gc3RyX3JlcGxhY2VfYWxsKHN0cl90b19sb3dlcihmdW5rY2phKSwgIlxcVyIsICIiKSkgJT4lDQogIGxlZnRfam9pbiguLFBCTF93c3BvbHR3b3JjeSAlPiUgc2VsZWN0KE9TX09TT0JBX0lELE9TX0xJQ1pCQV9aQVBJU09XLG5hendhX3Byb3N0YSksYnk9Yygid3NfcHJvc3R5Ij0ibmF6d2FfcHJvc3RhIikpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLE9TX05BWldJU0tPLE9TX0lNSUUsLU9TX0xJQ1pCQV9aQVBJU09XKQ0KQk5fd3Nwb2x0d29yY2EkaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKEJOX3dzcG9sdHdvcmNhWzE6Ml0pKQ0KQk5fd3Nwb2x0d29yY2EgPC0gQk5fd3Nwb2x0d29yY2FbIWR1cGxpY2F0ZWQoQk5fd3Nwb2x0d29yY2EkaWRfZ3J1cHkpLF0gJT4lDQogIGxlZnRfam9pbiguLFBCTF9mdW5rY2plLGJ5PWMoImZ1X3Byb3N0YSI9Im5hendhIikpICU+JQ0KICBtdXRhdGUoZm9fc3ltYm9sID0gaWZlbHNlKGZvX3N5bWJvbD09Ik5VTEwiLE5BLGFzLmNoYXJhY3Rlcihmb19zeW1ib2wpKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxPU19OQVpXSVNLTyxPU19JTUlFLE9TX09TT0JBX0lELGZvX3N5bWJvbCxmb19uYXp3YSxmdW5rY2phKQ0KDQojdHV0YWogcHJ6ZXN6dWthxIcgWDI0NSBpIHpuYWxlxbrEhyBixYLEmWR5IHdzcMOzxYJ0d8OzcmPDs3cNCm1hcmNfZmllbGRfMjQ1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1KSU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJ+IiksDQogICAgICAgICBYMjQ1PXN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNDUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNDUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjQ1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI0NTwtY2JpbmQobWFyY19maWVsZF8yNDUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNDUkWDI0NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI0NSRYMjQ1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI0NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI0NSRYMjQ1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNDUkWDI0NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF8yNDUgPC0gbWFyY19maWVsZF8yNDUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1Yz1gJGNgKQ0KDQpCTl93c3BvbHR3b3JjYSA8LSBCTl93c3BvbHR3b3JjYSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8yNDUsYnk9IlpBX1VXQUdJIikNCg0KeCA8LSAxOmxlbmd0aHMoQk5fd3Nwb2x0d29yY2FbMV0pDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBCTl93c3BvbHR3b3JjYSRjenlfbmF6d2lza29baV0gPC0gc3RyX2RldGVjdChCTl93c3BvbHR3b3JjYSRYMjQ1Y1tpXSxCTl93c3BvbHR3b3JjYSRPU19OQVpXSVNLT1tpXSkNCiAgQk5fd3Nwb2x0d29yY2EkY3p5X2ltaWVbaV0gPC0gZ3JlcGwoQk5fd3Nwb2x0d29yY2EkT1NfSU1JRVtpXSxCTl93c3BvbHR3b3JjYSRYMjQ1Y1tpXSkNCn0NCg0KQk5fd3Nwb2x0d29yY2EgPC0gQk5fd3Nwb2x0d29yY2EgJT4lDQogIG11dGF0ZShaQV9BRE5PVEFDSkUgPSBpZmVsc2UoY3p5X25hendpc2tvPT1GQUxTRXxjenlfaW1pZT09RkFMU0UscGFzdGUoIlVXQUdBISBLb25mbGlrdCB3IGRhbnljaCBvc29ib3d5Y2ggdyBwb2xhY2ggNzAwIGkgMjQ1LiBQb3LDs3duYWogcG9sYSB3c3DDs8WCdMOzcmPDs3cgdyBmb3JtdWxhcnp1IHogcG9sZW0gQk46ICIsWDI0NWMsc2VwID0gIiIpLE5BKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxPU19OQVpXSVNLTyxPU19JTUlFLE9TX09TT0JBX0lELGZvX3N5bWJvbCxmb19uYXp3YSxmdW5rY2phLFpBX0FETk9UQUNKRSkNCg0KIzc6IG9waXMgd3Nww7PFgnR3w7NyY8Ozdw0Kb3Bpc193c3BvbHR3b3Jjb3cgPC0gQk5fd3Nwb2x0d29yY2EgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxmdW5rY2phLE9TX0lNSUUsT1NfTkFaV0lTS08pICU+JQ0KICBmdWxsX2pvaW4oLixtYXJjX2ZpZWxkXzI0NSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShPU19OQVpXSVNLTyl8KGlzLm5hKE9TX05BWldJU0tPKSZncmVwbCgiZXQgYWxcXC4iLFgyNDVjKSkpICU+JQ0KICBtdXRhdGUoamVzdF9ldF9hbCA9IGdyZXBsKCJldCBhbFxcLiIsWDI0NWMpLA0KICAgICAgICAgT1NfSU1JRSA9IGlmZWxzZShPU19JTUlFPT0iKiIsIiIsYXMuY2hhcmFjdGVyKE9TX0lNSUUpKSwNCiAgICAgICAgIG9waXMgPSBpZmVsc2UoIWlzLm5hKE9TX05BWldJU0tPKSxwYXN0ZShmdW5rY2phLE9TX0lNSUUsIE9TX05BWldJU0tPLCBzZXAgPSAiICIpLCIiKSwNCiAgICAgICAgIG9waXMgPSBzdHJfcmVwbGFjZV9hbGwob3BpcywiICsiLCIgIiksDQogICAgICAgICBvcGlzID0gaWZlbHNlKG9waXM9PSIgIiwiIixhcy5jaGFyYWN0ZXIob3BpcykpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9waXMsamVzdF9ldF9hbCkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKG9waXMgPSBwYXN0ZShvcGlzLGNvbGxhcHNlID0gIiwgIiksDQogICAgICAgICBqZXN0X2V0X2FsID0gcGFzdGUodW5pcXVlKGplc3RfZXRfYWwpLHNlcCA9ICIiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShvcGlzID0gaWZlbHNlKGplc3RfZXRfYWw9PVRSVUUmb3Bpcz09IiIsImV0IGFsLiIsDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShqZXN0X2V0X2FsLHBhc3RlKG9waXMsImV0IGFsLiIsc2VwID0gIiAiKSxvcGlzKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksb3BpcykNCg0KIzcwMA0KbWFyY19maWVsZF83MDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg3MDApJT4lDQogIGZpbHRlcihYNzAwIT0iIikgJT4lDQogIG11dGF0ZShYNzAwPXN0cl9yZXBsYWNlX2FsbChYNzAwLCIoLi5cXCRhKSIsInxcXDEiKSwNCiAgICAgICAgIFg3MDA9c3RyX3JlcGxhY2VfYWxsKFg3MDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDcwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNzAwIT0iIikgJT4lDQogIG11dGF0ZShYNzAwPXN0cl9yZW1vdmVfYWxsKFg3MDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDcwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKSAlPiUNCiAgZmlsdGVyKFg3MDAhPSIiKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg3MDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF83MDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNzAwPC1jYmluZChtYXJjX2ZpZWxkXzcwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzcwMCRYNzAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNzAwJFg3MDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNzAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNzAwJFg3MDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzcwMCRYNzAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzcwMCA8LSBtYXJjX2ZpZWxkXzcwMCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9zb2JhID0gYCRhYCxmdW5rY2phID0gYCRlYCkgJT4lDQogIGZpbHRlcighaXMubmEoZnVua2NqYSkpICU+JQ0KICBtdXRhdGUob3NvYmEgPSBzdHJfcmVtb3ZlKG9zb2JhLCIoPzw9W2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKShcXC4kKSIpLA0KICAgICAgICAgT1NfTkFaV0lTS08gPSBpZmVsc2UoZ3JlcGwoIiwiLG9zb2JhKSxzdHJfcmVwbGFjZV9hbGwob3NvYmEsIiguKj8pKCwgKSguKikiLCJcXDEiKSxhcy5jaGFyYWN0ZXIob3NvYmEpKSwNCiAgICAgICAgIE9TX0lNSUUgPSBpZmVsc2UoZ3JlcGwoIiwiLG9zb2JhKSxzdHJfcmVwbGFjZV9hbGwob3NvYmEsIiguKj8pKCwgKSguKikiLCJcXDMiKSwiKiIpLA0KICAgICAgICAgZnVua2NqYV9kdXphID0gc3RyX3RvX2xvd2VyKGZ1bmtjamEpLA0KICAgICAgICAgb3BpcyA9IHBhc3RlKGZ1bmtjamFfZHV6YSxPU19JTUlFLE9TX05BWldJU0tPLCBzZXAgPSAiICIpLA0KICAgICAgICAgb3Bpc19kdXp5ID0gcGFzdGUoZnVua2NqYSxPU19JTUlFLE9TX05BWldJU0tPLCBzZXAgPSAiICIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9waXMsb3Bpc19kdXp5KSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUob3BpcyA9IHBhc3RlKG9waXMsY29sbGFwc2UgPSAiLiAiKSwNCiAgICAgICAgIG9waXNfZHV6eSA9IHBhc3RlKG9waXNfZHV6eSxjb2xsYXBzZSA9ICIuICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKQ0KDQojb3BpcyB3c3DDs8WCdHfDs3Jjw7N3IHplIHN0cmVmeSBvZHBvd2llZHppYWxub8WbY2kgMjQ1DQptYXJjX2ZpZWxkXzI0NSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NSklPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwifiIpLA0KICAgICAgICAgWDI0NT1zdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMjQ1IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDI0NSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI0NSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNDU8LWNiaW5kKG1hcmNfZmllbGRfMjQ1LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjQ1JFgyNDUgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNDUkWDI0NSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8yNDVbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8yNDUkWDI0NSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMjQ1JFgyNDUpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfMjQ1IDwtIG1hcmNfZmllbGRfMjQ1ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRjYCkNCg0KI3BvcsOzd25hbmllIG9waXN1IHdzcMOzxYJ0d8OzcmPDs3cgeiAyNDUgaSA3MDANCndzcG9sdHdvcmN5IDwtIG1hcmNfZmllbGRfNzAwICU+JQ0KICBmdWxsX2pvaW4oLixtYXJjX2ZpZWxkXzI0NSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgY1NwbGl0KC4sIiRjIixzZXAgPSAiIDsgIixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICAjb2dyYW5pY3phbmllIG9zw7NiIHplIHN0cmVmeSBvZHBvd2llZHppYWxub8WbY2kNCiAgbXV0YXRlKGN6eV9tYWxhID0gZ3JlcGwoIiBbYS16xJnDs8SFxZvFgsW8xbrEh8WEXXxeW2EtesSZw7PEhcWbxYLFvMW6xIfFhF18XFxbW2EtesSZw7PEhcWbxYLFvMW6xIfFhF0iLGAkY2AsaWdub3JlLmNhc2UgPSBGQUxTRSkpICU+JQ0KICBmaWx0ZXIoY3p5X21hbGE9PVRSVUUpICU+JQ0KICBzZWxlY3QoLWN6eV9tYWxhKSAlPiUNCiAgI211dGF0ZShgJGNgID0gZ3N1YigiXihcXFspezAsMX0oW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKSIsIlxcMVxcVVxcMiIscGVybCA9IFRSVUUsYCRjYCkpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShYMjQ1ID0gcGFzdGUoYCRjYCwgY29sbGFwc2UgPSAiLCAiKSkgJT4lDQogIHNlbGVjdCgtYCRjYCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUob3JkZXJfcGJsID0gYXMuY2hhcmFjdGVyKHN0cl9leHRyYWN0X2FsbChvcGlzLCIoPzw9XnwgfFxcW3wtKShbQS1aQcOBw4DDgsODw4TEgsSAw4XEhMOGRcOJw4jDisOLxJrEksSWxJhJw43DjMOOw4/EqsSuSU/Dk8OSw5TDlcOWxZDDmMWSVcOaw5nDm8OcxbDFqsWvWcOdQ8SGxIzDp0TEjsSQxJBHxKLEnkvEtkzFgcS7TsWDw5HFh8WFxYpSxZhTxZrFoMWeU8OfVMWkxabDnsWiOFrFu8W5xb1hLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkiKSksDQogICAgICAgICBvcmRlcl9wYmwgPSBzdHJfcmVwbGFjZV9hbGwob3JkZXJfcGJsLCIoLio/XCIpKC4pKFwiLio/LikiLCAiXFwyIiksDQogICAgICAgICBvcmRlcl9ibiA9IGFzLmNoYXJhY3RlcihzdHJfZXh0cmFjdF9hbGwoWDI0NSwiKD88PV58IHxcXFt8LSkoW0EtWkHDgcOAw4LDg8OExILEgMOFxITDhkXDicOIw4rDi8SaxJLElsSYScONw4zDjsOPxKrErklPw5PDksOUw5XDlsWQw5jFklXDmsOZw5vDnMWwxarFr1nDnUPEhsSMw6dExI7EkMSQR8SixJ5LxLZMxYHEu07Fg8ORxYfFhcWKUsWYU8WaxaDFnlPDn1TFpMWmw57FojhaxbvFucW9YS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pIikpLA0KICAgICAgICAgb3JkZXJfYm4gPSBzdHJfcmVwbGFjZV9hbGwob3JkZXJfYm4sIiguKj9cIikoLikoXCIuKj8uKSIsICJcXDIiKSwNCiAgICAgICAgIFgyNDUgPSBzdHJfcmVtb3ZlKFgyNDUsICJcXC4kIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCAiXFxbIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCAiXFxdIiksDQogICAgICAgICBvcmRlcl9wYmwgPSBzdHJfcmVtb3ZlX2FsbChvcmRlcl9wYmwsICJbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0iKSwNCiAgICAgICAgIG9yZGVyX2JuID0gc3RyX3JlbW92ZV9hbGwob3JkZXJfYm4sICJbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0iKSwNCiAgICAgICAgIHRvX3NhbW8gPSBvcmRlcl9wYmw9PW9yZGVyX2JuLA0KICAgICAgICAgWDI0NSA9IGdzdWIoIiheW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKSguKikiLCJcXFVcXDFcXEVcXDIiLHBlcmwgPSBUUlVFLCBYMjQ1KSkgJT4lDQogIGxlZnRfam9pbiguLHphX2plenlrX29yeWdpbmFsdSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKGN6eV9wbCA9IGdyZXBsKCJwb2wiLFpBX0pFWllLX09SWUdJTkFMVSl8aXMubmEoWkFfSkVaWUtfT1JZR0lOQUxVKSwNCiAgICAgICAgIGRlY3l6amEgPSBpZmVsc2UodG9fc2Ftbz09RkFMU0V8Y3p5X3BsPT1GQUxTRSxGQUxTRSxUUlVFKSkNCg0KemFfb3Bpc193c3BvbHR3b3Jjb3cgPC0gd3Nwb2x0d29yY3kgJT4lDQogIG11dGF0ZSh6YV9vcGlzX3dzcG9sdHdvcmNvdyA9IGlmZWxzZShkZWN5emphPT1UUlVFLGFzLmNoYXJhY3RlcihYMjQ1KSxwYXN0ZShYMjQ1LG9waXNfZHV6eSxzZXAgPSAiIyIpKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxvcGlzX2R1enksemFfb3Bpc193c3BvbHR3b3Jjb3cpICU+JQ0KICBjU3BsaXQoLiwiemFfb3Bpc193c3BvbHR3b3Jjb3ciLHNlcCA9ICIjIixkaXJlY3Rpb24gPSAid2lkZSIpICU+JQ0KICBtdXRhdGUoemFfb3Bpc193c3BvbHR3b3Jjb3dfMiA9IGlmZWxzZShpcy5uYSh6YV9vcGlzX3dzcG9sdHdvcmNvd18yKSwnJyxhcy5jaGFyYWN0ZXIoemFfb3Bpc193c3BvbHR3b3Jjb3dfMikpLA0KICAgICAgICAgdG9fc2FtbyA9IHphX29waXNfd3Nwb2x0d29yY293XzE9PXphX29waXNfd3Nwb2x0d29yY293XzIpICU+JQ0KICBmaWx0ZXIodG9fc2Ftbz09RkFMU0UpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZSh6YV9vcGlzX3dzcG9sdHdvcmNvdyA9IHBhc3RlKHphX29waXNfd3Nwb2x0d29yY293XzEsemFfb3Bpc193c3BvbHR3b3Jjb3dfMixzZXAgPSAiIyIpLA0KICAgICAgICAgemFfb3Bpc193c3BvbHR3b3Jjb3cgPSBzdHJfcmVtb3ZlX2FsbCh6YV9vcGlzX3dzcG9sdHdvcmNvdywiXFwjJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLHphX29waXNfd3Nwb2x0d29yY293KQ0KDQpvcGlzX3dzcG9sdHdvcmNvdyA8LSBvcGlzX3dzcG9sdHdvcmNvdyAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgemFfb3Bpc193c3BvbHR3b3Jjb3ckWkFfVVdBR0kpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKG9waXMpKSAlPiUNCiAgcmVuYW1lKHphX29waXNfd3Nwb2x0d29yY293ID0gb3BpcykNCg0KemFfb3Bpc193c3BvbHR3b3Jjb3cgPC0gemFfb3Bpc193c3BvbHR3b3Jjb3cgJT4lDQogIGJpbmRfcm93cyguLG9waXNfd3Nwb2x0d29yY293KSAlPiUNCiAgcmlnaHRfam9pbiguLGRhdGEgJT4lIHNlbGVjdChaQV9VV0FHSSksYnk9IlpBX1VXQUdJIikNCg0KIzggd3lkYW5pZQ0KbWFyY19maWVsZF8yNTAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNTApJT4lDQogIGZpbHRlcihYMjUwIT0iIikgJT4lDQogIG11dGF0ZShYMjUwPXN0cl9yZXBsYWNlX2FsbChYMjUwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNTAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI1MCE9IiIpICU+JQ0KICBtdXRhdGUoWDI1MD1zdHJfcmVtb3ZlX2FsbChYMjUwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNTAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjUwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjUwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI1MDwtY2JpbmQobWFyY19maWVsZF8yNTAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNTAkWDI1MCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI1MCRYMjUwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI1MFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI1MCRYMjUwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNTAkWDI1MCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQp6YV93eWRhbmllIDwtIG1hcmNfZmllbGRfMjUwICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIHd5ZGFuaWUgPSBgJGFgKSAlPiUNCiAgbXV0YXRlKHd5ZGFuaWUgPSBzdHJfcmVtb3ZlKHd5ZGFuaWUsIiBcXC8kIikpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojOTogaW5zdHl0dWNqYSBzcHJhd2N6YQ0KbWFyY19maWVsZF8yNDUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIn4iKSwNCiAgICAgICAgIFgyNDU9c3RyX3JlcGxhY2VfYWxsKFgyNDUsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDI0NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8yNDUpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMjQ1PC1jYmluZChtYXJjX2ZpZWxkXzI0NSxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzI0NSRYMjQ1IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMjQ1JFgyNDUsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMjQ1WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMjQ1JFgyNDUpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzI0NSRYMjQ1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCnphX2luc3R5dHVjamEgPC0gbWFyY19maWVsZF8yNDUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1Yz1gJGNgKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShYMjQ1YykpICU+JQ0KICBtdXRhdGUoaW5zdHl0dWNqYSA9IGlmZWxzZShncmVwbCgiXFw7IixYMjQ1Yyksc3RyX3JlcGxhY2VfYWxsKFgyNDVjLCAiKC4qPykoXFw7KD8hLipcXDspKSggKSsoLio/JCkiLCJcXDQiKSwiIikpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93c3BvbHR3b3JjYSxieT0iWkFfVVdBR0kiKQ0KDQp4IDwtIDE6bGVuZ3Rocyh6YV9pbnN0eXR1Y2phWzFdKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgemFfaW5zdHl0dWNqYSRjenlfbmF6d2lza29baV0gPC0gZ3JlcGwoemFfaW5zdHl0dWNqYSRPU19OQVpXSVNLT1tpXSx6YV9pbnN0eXR1Y2phJFgyNDVjW2ldKQ0KICB6YV9pbnN0eXR1Y2phJGN6eV9pbWllW2ldIDwtIGdyZXBsKHphX2luc3R5dHVjamEkT1NfSU1JRVtpXSx6YV9pbnN0eXR1Y2phJFgyNDVjW2ldKQ0KfQ0KDQp6YV9pbnN0eXR1Y2phIDwtIHphX2luc3R5dHVjamEgJT4lDQogIGZpbHRlcihpcy5uYShjenlfbmF6d2lza28pJmlzLm5hKGN6eV9pbWllKSkgJT4lDQogIGZpbHRlcihpbnN0eXR1Y2phIT0iIikgJT4lDQogIGZpbHRlcighZ3JlcGwoIl5cXFtbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl18XlthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSIsaW5zdHl0dWNqYSkpICU+JQ0KICBtdXRhdGUoaW5zdHl0dWNqYSA9IHN0cl9yZW1vdmUoaW5zdHl0dWNqYSwiXFwuJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGluc3R5dHVjamEpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojMTA6IHd5ZGF3bmljdHdvDQpCTl93eWRhd25pY3R3byA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIFgyNjApICU+JQ0KICBtdXRhdGUoWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJzXFwublxcLiIsICJiLncuIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJzXFwubFxcLiIsICJiLm0uIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJTXFwubFxcLiIsICJiLm0uIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZW1vdmUoWDI2MCwiXlxcXFwrIiksIA0KICAgICAgICAgcm9rX3d5ZGFuaWEgPSBzdHJfZXh0cmFjdF9hbGwoWDI2MCwgIig/PD1cXCRjKS4qKD89XFwkZSl8KD88PVxcJGMpLioiKSwgDQogICAgICAgICBiZXpfcm9rdSA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCAiLlxcJGMuKiIsICIiKSwgDQogICAgICAgICBpbGVfd3lkYXduaWN0dyA9IHN0cl9jb3VudChiZXpfcm9rdSwgIlxcJGIiKSwNCiAgICAgICAgIGlsZV9taWVqc2MgPSBzdHJfY291bnQoYmV6X3Jva3UsICJcXCRhIiksDQogICAgICAgICBrb2xlam5vc2MgPSBzdHJfcmVwbGFjZV9hbGwoYXMuY2hhcmFjdGVyKHN0cl9leHRyYWN0X2FsbChiZXpfcm9rdSwgIlxcJC4iKSksICJbXmEtel0iLCAiIiksDQogICAgICAgICBiZXpfcm9rdSA9IHN0cl9yZXBsYWNlX2FsbChiZXpfcm9rdSwgIjtcXCRiIiwgIjokYiIpLA0KICAgICAgICAgd3lkYXdfcG9kemllbCA9IGlmZWxzZShpbGVfd3lkYXduaWN0dz5pbGVfbWllanNjfGtvbGVqbm9zYz09ImNhYWJiIiwgc3RyX3JlcGxhY2VfYWxsKGJlel9yb2t1LCAiKFxcJGEpKC4qPykoIDpcXCRiLio/KSggOlxcJGIpIiwgIlxcMVxcMlxcMyA7JGFcXDJcXDQiKSxiZXpfcm9rdSksDQogICAgICAgICB3eWRhd25pY3R3b190ZXN0ID0gc3RyX3JlcGxhY2VfYWxsKHd5ZGF3X3BvZHppZWwsICIoXFwkYikoLio/KSggO1xcJGEpIiwgIlxcMVxcMnxcXDMiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxyb2tfd3lkYW5pYSx3eWRhd25pY3R3b190ZXN0KSAlPiUNCiAgY1NwbGl0KC4sICJ3eWRhd25pY3R3b190ZXN0Iiwgc2VwID0gInwiLCBkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBtdXRhdGUod3lkYXduaWN0d28gPSBzdHJfZXh0cmFjdF9hbGwod3lkYXduaWN0d29fdGVzdCwgIig/PD1cXCRiKSguKikiKSwNCiAgICAgICAgIG1pZWpzY2Vfd3lkYW5pYSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfZXh0cmFjdF9hbGwod3lkYXduaWN0d29fdGVzdCwgIig/PD1cXCRhKSguKikoPz0gezAsMX06IHswLDF9XFwkYil8KD88PVxcJGEpKC4qKSgkKSIpLCIgO1xcJGEiLCAiLCAiKSwNCiAgICAgICAgIG5hendhX3Byb3N0YSA9IHN0cl90b19sb3dlcihzdHJfcmVwbGFjZV9hbGwoc3RyX3JlcGxhY2VfYWxsKHVubGlzdCh3eWRhd25pY3R3b190ZXN0KSwgIlxcJFxcdyIsICIiKSwgIlxcVyIsICIiKSkpICU+JQ0KICBsZWZ0X2pvaW4oLixQQkxfd3lkYXduaWN0d2EsYnk9Im5hendhX3Byb3N0YSIpICU+JQ0KICBtdXRhdGUodG9fc2FtbyA9IHd5ZGF3bmljdHdvPT1XWV9OQVpXQSkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksLXRvX3NhbW8sLVdZX0xJQ1pCQV9aQVBJU09XKQ0KQk5fd3lkYXduaWN0d28kaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKEJOX3d5ZGF3bmljdHdvWzE6M10pKQ0KQk5fd3lkYXduaWN0d28gPC0gQk5fd3lkYXduaWN0d29bIWR1cGxpY2F0ZWQoQk5fd3lkYXduaWN0d28kaWRfZ3J1cHkpLF0gJT4lDQogIG11dGF0ZShXWV9OQVpXQSA9IGlmZWxzZSghaXMubmEoV1lfTkFaV0EpLGFzLmNoYXJhY3RlcihXWV9OQVpXQSksYXMuY2hhcmFjdGVyKHd5ZGF3bmljdHdvKSksDQogICAgICAgICBXWV9NSUFTVE8gPSBpZmVsc2UoIWlzLm5hKFdZX01JQVNUTyksYXMuY2hhcmFjdGVyKFdZX01JQVNUTyksdHJpbShhcy5jaGFyYWN0ZXIobWllanNjZV93eWRhbmlhKSkpLA0KICAgICAgICAgcm9rX3d5ZGFuaWEgPSBzdHJfcmVwbGFjZV9hbGwocm9rX3d5ZGFuaWEsICIoLiopKFxcLikiLCAiXFwxIiksDQogICAgICAgICB6YV9yb2tfd3lkYW5pYSA9IGlmZWxzZShuY2hhcihyb2tfd3lkYW5pYSk9PTQsYXMuY2hhcmFjdGVyKHJva193eWRhbmlhKSxOQSksDQogICAgICAgICBkb19vcGlzdSA9IGlmZWxzZShpcy5uYSh6YV9yb2tfd3lkYW5pYSkscGFzdGUoIlsiLHN0cl9leHRyYWN0KHJva193eWRhbmlhLCJcXGR7NH0iKSwiXSIsc2VwID0gIiIpLCIiKSwNCiAgICAgICAgIFdZX01JQVNUTyA9IGlmZWxzZShzdWJzdHIoV1lfTUlBU1RPLDEsMSk9PSJbIiZzdWJzdHIoV1lfTUlBU1RPLG5jaGFyKFdZX01JQVNUTyksbmNoYXIoV1lfTUlBU1RPKSkhPSJdIiZpcy5uYShXWV9XWURBV05JQ1RXT19JRCkscGFzdGUodHJpbShXWV9NSUFTVE8pLCJdIixzZXAgPSAiIiksYXMuY2hhcmFjdGVyKFdZX01JQVNUTykpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFdZX1dZREFXTklDVFdPX0lELFdZX05BWldBLFdZX01JQVNUTyx6YV9yb2tfd3lkYW5pYSxkb19vcGlzdSkgJT4lIA0KICBtdXRhdGUoV1lfTkFaV0EgPSBpZmVsc2Uoc3RyX2NvdW50KFdZX05BWldBLCAiXFxbIik+c3RyX2NvdW50KFdZX05BWldBLCAiXFxdIiksIHBhc3RlKFdZX05BWldBLCAiXSIsIHNlcCA9ICIiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfY291bnQoV1lfTkFaV0EsICJcXFsiKTxzdHJfY291bnQoV1lfTkFaV0EsICJcXF0iKSwgcGFzdGUoIlsiLCBXWV9OQVpXQSwgc2VwID0gIiIpLCBhcy5jaGFyYWN0ZXIoV1lfTkFaV0EpKSksDQogICAgICAgICBXWV9NSUFTVE8gPSBpZmVsc2Uoc3RyX2NvdW50KFdZX01JQVNUTywgIlxcWyIpPnN0cl9jb3VudChXWV9NSUFTVE8sICJcXF0iKSwgcGFzdGUoV1lfTUlBU1RPLCAiXSIsIHNlcCA9ICIiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfY291bnQoV1lfTUlBU1RPLCAiXFxbIik8c3RyX2NvdW50KFdZX01JQVNUTywgIlxcXSIpLCBwYXN0ZSgiWyIsIFdZX01JQVNUTywgc2VwID0gIiIpLCBhcy5jaGFyYWN0ZXIoV1lfTUlBU1RPKSkpKQ0KDQojMTE6IG9waXMgZml6eWN6bnkga3NpxIXFvGtpDQojcG9sZSAzMDAgZG8gb3Bpc3UgZml6eWN6bmVnbw0KbWFyY19maWVsZF8zMDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgzMDApJT4lDQogIGZpbHRlcihYMzAwIT0iIikgJT4lDQogIG11dGF0ZShYMzAwPXN0cl9yZXBsYWNlX2FsbChYMzAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgzMDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDMwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDMwMD1zdHJfcmVtb3ZlX2FsbChYMzAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgzMDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMzAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMzAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzMwMDwtY2JpbmQobWFyY19maWVsZF8zMDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8zMDAkWDMwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzMwMCRYMzAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzMwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzMwMCRYMzAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8zMDAkWDMwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF8zMDAgPC0gbWFyY19maWVsZF8zMDAgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlbW92ZShgJGFgLCIgXFw7KyR8IFxcOiskIiksDQogICAgICAgICBgJGJgID0gc3RyX3JlbW92ZShgJGJgLCIgXFw7KyR8IFxcOiskIiksDQogICAgICAgICBgJGVgID0gaWZlbHNlKGdyZXBsKCJDRC1ST018RFZEfFZDRHxDRCIsYCRlYCkmZ3JlcGwoIlxcKyBkeXNrfHDFgnl0IixgJGVgKSxzdHJfZXh0cmFjdChgJGVgLCIoPzw9XFwrKShkeXNrfHDFgnl0Lio/KShDRC1ST018RFZEfFZDRHxDRCkoXFwpKXswLDF9IiksDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiQ0QtUk9NfERWRHxWQ0R8Q0QiLGAkZWApLHN0cl9leHRyYWN0KGAkZWAsIiheLio/KShDRC1ST018RFZEfFZDRHxDRCkoXFwpKXswLDF9IiksTkEpKSwNCiAgICAgICAgIGAkYWAgPSBpZmVsc2UoaXMubmEoYCRhYCksIiIsYXMuY2hhcmFjdGVyKGAkYWApKSwNCiAgICAgICAgIGAkYmAgPSBpZmVsc2UoaXMubmEoYCRiYCksIiIsYXMuY2hhcmFjdGVyKGAkYmApKSwNCiAgICAgICAgIGAkZWAgPSBpZmVsc2UoaXMubmEoYCRlYCksIiIsYXMuY2hhcmFjdGVyKGAkZWApKSkNCiNwb2xlIDUwMCBkbyBvcGlzdSBmaXp5Y3puZWdvDQptYXJjX2ZpZWxkXzUwMCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDUwMCklPiUNCiAgZmlsdGVyKFg1MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg1MDA9c3RyX3JlcGxhY2VfYWxsKFg1MDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDUwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNTAwIT0iIikgJT4lDQogIG11dGF0ZShYNTAwPXN0cl9yZW1vdmVfYWxsKFg1MDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDUwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg1MDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF81MDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNTAwPC1jYmluZChtYXJjX2ZpZWxkXzUwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzUwMCRYNTAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNTAwJFg1MDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNTAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNTAwJFg1MDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzUwMCRYNTAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzUwMCA8LSBtYXJjX2ZpZWxkXzUwMCAlPiUNCiAgbXV0YXRlKGAkYWAgPSBpZmVsc2UoZ3JlcGwoIm9yeWcoXFwufFxcLCkiLFg1MDApJmdyZXBsKCJwc2V1ZHxuYXp3YSIsWDUwMCxpZ25vcmUuY2FzZSA9IFRSVUUpLHN0cl9yZXBsYWNlKGAkYWAsIiheLio/KShcXC4gKShcXHB7THV9LiokKSIsIlxcMyIpLGFzLmNoYXJhY3RlcihgJGFgKSkpICU+JSANCiAgZmlsdGVyKCFncmVwbCgib3J5ZyhcXC58XFwsKSIsYCRhYCkmZ3JlcGwoInBzZXVkfG5hendhfGRvdHljenxwb2wiLGAkYWAsaWdub3JlLmNhc2UgPSBUUlVFKSkgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlbW92ZShgJGFgLCIgXFw7KyR8IFxcOiskIikpDQoNCiNwb2xlIDU0NiBkbyBvcGlzdSBmaXp5Y3puZWdvDQptYXJjX2ZpZWxkXzU0NiA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDU0NiklPiUNCiAgZmlsdGVyKFg1NDYhPSIiKSAlPiUNCiAgbXV0YXRlKFg1NDY9c3RyX3JlcGxhY2VfYWxsKFg1NDYsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDU0NiIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNTQ2IT0iIikgJT4lDQogIG11dGF0ZShYNTQ2PXN0cl9yZW1vdmVfYWxsKFg1NDYsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDU0NiwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg1NDYsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF81NDYpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNTQ2PC1jYmluZChtYXJjX2ZpZWxkXzU0NixlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzU0NiRYNTQ2IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNTQ2JFg1NDYsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNTQ2WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNTQ2JFg1NDYpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzU0NiRYNTQ2KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzU0NiA8LSBtYXJjX2ZpZWxkXzU0NiAlPiUNCiAgbXV0YXRlKGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIiBcXDsrJHwgXFw6KyQiKSkNCg0KI3BvbGUgNTAxIGRvIG9waXN1IGZpenljem5lZ28NCm1hcmNfZmllbGRfNTAxIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNTAxKSU+JQ0KICBmaWx0ZXIoWDUwMSE9IiIpICU+JQ0KICBtdXRhdGUoWDUwMT1zdHJfcmVwbGFjZV9hbGwoWDUwMSwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNTAxIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg1MDEhPSIiKSAlPiUNCiAgbXV0YXRlKFg1MDE9c3RyX3JlbW92ZV9hbGwoWDUwMSwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNTAxLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDUwMSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzUwMSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF81MDE8LWNiaW5kKG1hcmNfZmllbGRfNTAxLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNTAxJFg1MDEgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF81MDEkWDUwMSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF81MDFbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF81MDEkWDUwMSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNTAxJFg1MDEpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfNTAxIDwtIG1hcmNfZmllbGRfNTAxICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIGAkYWApDQoNCnphX29waXNfa3MgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3lkYXduaWN0d28gJT4lIHNlbGVjdChaQV9VV0FHSSxkb19vcGlzdSksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMzAwICU+JSBzZWxlY3QoWkFfVVdBR0ksWDMwMGE9YCRhYCxYMzAwYj1gJGJgLFgzMDBlPWAkZWApLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzUwMCAlPiUgc2VsZWN0KFpBX1VXQUdJLFg1MDBhPWAkYWApLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzU0NiAlPiUgc2VsZWN0KFpBX1VXQUdJLFg1NDZhPWAkYWApLGJ5PSJaQV9VV0FHSSIpICU+JSANCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF81MDEgJT4lIHNlbGVjdChaQV9VV0FHSSxYNTAxYT1gJGFgKSxieT0iWkFfVVdBR0kiKQ0KemFfb3Bpc19rc1tpcy5uYSh6YV9vcGlzX2tzKV0gIDwtICIiDQp6YV9vcGlzX2tzIDwtIHphX29waXNfa3MgJT4lDQogIG11dGF0ZSh6YV9vcGlzX2tzID0gcGFzdGUoaWZlbHNlKGRvX29waXN1IT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoZG9fb3Bpc3UpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDMwMGEhPSIiLHBhc3RlKGFzLmNoYXJhY3RlcihYMzAwYSksIiwgIixzZXAgPSAiIiksIiIpLGlmZWxzZShYMzAwYiE9IiIscGFzdGUoYXMuY2hhcmFjdGVyKFgzMDBiKSwiLCAiLHNlcCA9ICIiKSwiIiksaWZlbHNlKFgzMDBlIT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoWDMwMGUpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDUwMGEhPSIiLHBhc3RlKGFzLmNoYXJhY3RlcihYNTAwYSksIiwgIixzZXAgPSAiIiksIiIpLGlmZWxzZShYNTQ2YSE9IiIsYXMuY2hhcmFjdGVyKFg1NDZhKSwiIiksaWZlbHNlKFg1MDFhIT0iIixhcy5jaGFyYWN0ZXIoWDUwMWEpLCIiKSxzZXAgPSAiIiksDQogICAgICAgICB6YV9vcGlzX2tzID0gc3RyX3JlbW92ZSh6YV9vcGlzX2tzLCIoLCApKyQiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSx6YV9vcGlzX2tzKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksLW5jaGFyKHphX29waXNfa3MpKQ0KemFfb3Bpc19rcyRpZF9ncnVweSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQoemFfb3Bpc19rc1sxXSkpDQp6YV9vcGlzX2tzIDwtIHphX29waXNfa3NbIWR1cGxpY2F0ZWQoemFfb3Bpc19rcyRpZF9ncnVweSksXSAlPiUNCiAgc2VsZWN0KC1pZF9ncnVweSkNCg0KIzEyOiBzZXJpYSB3eWRhd25pY3phDQptYXJjX2ZpZWxkXzQ5MCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDQ5MCxYODAwLFg4MzApICU+JQ0KICBtdXRhdGUoWDQ5MCA9IGlmZWxzZShncmVwbCgiVVxcKyIsWDQ5MCksYXMuY2hhcmFjdGVyKFg4MzApLGFzLmNoYXJhY3RlcihYNDkwKSkpICU+JQ0KICBtdXRhdGUoWDgwMCA9IGlmZWxzZShYNDkwIT0iIiwiIixhcy5jaGFyYWN0ZXIoWDgwMCkpLA0KICAgICAgICAgWDgzMCA9IGlmZWxzZShYNDkwIT0iIiwiIixhcy5jaGFyYWN0ZXIoWDgzMCkpLA0KICAgICAgICAgWDgwMCA9IHN0cl9yZXBsYWNlKFg4MDAsIihcXCRhKSguKikoXFwkdCkiLCJcXDEiKSwNCiAgICAgICAgIFg0OTAgPSBpZmVsc2UoWDQ5MD09IiImWDgzMCE9IiIsYXMuY2hhcmFjdGVyKFg4MzApLA0KICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoWDQ5MD09IiImWDgwMCE9IiIsYXMuY2hhcmFjdGVyKFg4MDApLGFzLmNoYXJhY3RlcihYNDkwKSkpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg0OTApICU+JQ0KICBmaWx0ZXIoWDQ5MCE9IiIpICU+JQ0KICBtdXRhdGUoWDQ5MD1zdHJfcmVwbGFjZV9hbGwoWDQ5MCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNDkwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg0OTAhPSIiKSAlPiUNCiAgbXV0YXRlKFg0OTA9c3RyX3JlbW92ZV9hbGwoWDQ5MCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNDkwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDQ5MCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzQ5MClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF80OTA8LWNiaW5kKG1hcmNfZmllbGRfNDkwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNDkwJFg0OTAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF80OTAkWDQ5MCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF80OTBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF80OTAkWDQ5MCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNDkwJFg0OTApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCnphX3NlcmlhX3d5ZGF3bmljemEgPC0gbWFyY19maWVsZF80OTAgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlcGxhY2VfYWxsKGAkYWAsIig9KShcXCRhKSIsIlxcMSAiKSwNCiAgICAgICAgIGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIiBcXDsrJHwgXFw6KyQiKSwNCiAgICAgICAgIGAkdmAgPSBpZmVsc2UoaXMubmEoYCR2YCksIiIsYXMuY2hhcmFjdGVyKGAkdmApKSkgJT4lDQogIGZpbHRlcighaXMubmEoYCRhYCkpICU+JQ0KICBtdXRhdGUoc2VyaWEgPSBzdHJfcmVtb3ZlKHBhc3RlKCIoIixgJGFgLCI7ICIsYCR2YCwiKSIsc2VwID0gIiIpLCI7ICg/PVxcKSQpIiksDQogICAgICAgICBzZXJpYSA9IGdzdWIoIiggOiApKC4pIiwiLiBcXFVcXDIiLHBlcmw9VFJVRSxzZXJpYSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksc2VyaWEpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShzZXJpYSA9IHBhc3RlKHNlcmlhLGNvbGxhcHNlID0gIiAiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShzZXJpYSA9IHN0cl9yZXBsYWNlX2FsbChzZXJpYSwiXFwkLiIsIjsgIikpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojMTM6IHRvbXkNCnphX3RvbXkgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKHphX3RvbXkgPSBOQSkNCg0KIzE0OiBhZG5vdGFjamUNCnphX2Fkbm90YWNqZSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl9hdXRvciAlPiUgc2VsZWN0KFpBX1VXQUdJLFpBX0FETk9UQUNKRSksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLEJOX3dzcG9sdHdvcmNhICU+JSBzZWxlY3QoWkFfVVdBR0ksWkFfQUROT1RBQ0pFKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKFpBX0FETk9UQUNKRSA9IHBhc3RlKGlmZWxzZShpcy5uYShaQV9BRE5PVEFDSkUueCksIiIscGFzdGUoYXMuY2hhcmFjdGVyKFpBX0FETk9UQUNKRS54KSwiIyAiLHNlcCA9ICIiKSksaWZlbHNlKGlzLm5hKFpBX0FETk9UQUNKRS55KSwiIixhcy5jaGFyYWN0ZXIoWkFfQUROT1RBQ0pFLnkpKSxzZXAgPSAiIiksDQogICAgICAgICBaQV9BRE5PVEFDSkUgPSBzdHJfcmVtb3ZlKFpBX0FETk9UQUNKRSwiKCMgKSskIikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWkFfQUROT1RBQ0pFKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksLW5jaGFyKFpBX0FETk9UQUNKRSkpDQp6YV9hZG5vdGFjamUkaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKHphX2Fkbm90YWNqZVsxXSkpDQp6YV9hZG5vdGFjamUgPC0gemFfYWRub3RhY2plWyFkdXBsaWNhdGVkKHphX2Fkbm90YWNqZSRpZF9ncnVweSksXSAlPiUNCiAgc2VsZWN0KC1pZF9ncnVweSkNCg0KIzE1OiBCTl9VUkwNCkJOX1VSTCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksQk5fVVJMKQ0KDQojd3lyw7N3bmFuaWUgbGljemJ5IHdpZXJzenkgZG8gbGljemJ5IHdpZXJzenkgb2JpZWt0dSBkYXRhDQpCTl9hdXRvciA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl9hdXRvciAlPiUgc2VsZWN0KFpBX1VXQUdJLEFNX0FVVE9SX0lELEFNX05BWldJU0tPLEFNX0lNSUUpLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBkZHBseSguLCAuKFpBX1VXQUdJKSwgc3VtbWFyaXplLCBBTV9BVVRPUl9JRCA9IHBhc3RlKEFNX0FVVE9SX0lELCBjb2xsYXBzZT0ifCIpLCBBTV9OQVpXSVNLTyA9IHBhc3RlKEFNX05BWldJU0tPLCBjb2xsYXBzZT0ifCIpLCBBTV9JTUlFID0gcGFzdGUoQU1fSU1JRSwgY29sbGFwc2U9InwiKSkNCkJOX3dzcG9sdHdvcmNhIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLEJOX3dzcG9sdHdvcmNhICU+JSBzZWxlY3QoWkFfVVdBR0ksT1NfT1NPQkFfSUQsT1NfTkFaV0lTS08sT1NfSU1JRSxmb19zeW1ib2wpLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBkZHBseSguLCAuKFpBX1VXQUdJKSwgc3VtbWFyaXplLCBPU19PU09CQV9JRCA9IHBhc3RlKE9TX09TT0JBX0lELCBjb2xsYXBzZT0ifCIpLCBPU19OQVpXSVNLTyA9IHBhc3RlKE9TX05BWldJU0tPLCBjb2xsYXBzZT0ifCIpLCBPU19JTUlFID0gcGFzdGUoT1NfSU1JRSwgY29sbGFwc2U9InwiKSwgZm9fc3ltYm9sID0gcGFzdGUoZm9fc3ltYm9sLCBjb2xsYXBzZT0ifCIpKSAlPiUNCiAgbXV0YXRlKGZvX3N5bWJvbCA9IGlmZWxzZShmb19zeW1ib2w9PSJOVUxMIiwiTkEiLGFzLmNoYXJhY3Rlcihmb19zeW1ib2wpKSkNCkJOX3d5ZGF3bmljdHdvIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLEJOX3d5ZGF3bmljdHdvICU+JSBzZWxlY3QoWkFfVVdBR0ksV1lfV1lEQVdOSUNUV09fSUQsV1lfTkFaV0EsV1lfTUlBU1RPLHphX3Jva193eWRhbmlhKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgZGRwbHkoLiwgLihaQV9VV0FHSSksIHN1bW1hcml6ZSwgV1lfV1lEQVdOSUNUV09fSUQgPSBwYXN0ZShXWV9XWURBV05JQ1RXT19JRCwgY29sbGFwc2U9InwiKSwgV1lfTkFaV0EgPSBwYXN0ZShXWV9OQVpXQSwgY29sbGFwc2U9InwiKSwgV1lfTUlBU1RPID0gcGFzdGUoV1lfTUlBU1RPLCBjb2xsYXBzZT0ifCIpLCB6YV9yb2tfd3lkYW5pYSA9IHBhc3RlKHVuaXF1ZSh6YV9yb2tfd3lkYW5pYSksIGNvbGxhcHNlPSJ8IikpICU+JQ0KICBtdXRhdGUoemFfcm9rX3d5ZGFuaWEgPSBpZmVsc2UoemFfcm9rX3d5ZGFuaWE9PSJOQSIsIiIsYXMuaW50ZWdlcih6YV9yb2tfd3lkYW5pYSkpKQ0KDQojcG/FgsSFY3plbmllIHdzenlzdGtpY2ggZWxlbWVudMOzdyB3IGplZG7EhSB0YWJlbMSZDQprb2xlam5vc2MgPC0gZGF0YS5mcmFtZShrb2xlam5vc2M9YygiWkFfVVdBR0kiLCJSWl9OQVpXQSIsIlpBX1JPX1JPSyIsIlpBX1RZUEUiLCJSWl9ST0RaQUpfSUQiLCJEWl9OQVpXQSIsIkRaX0RaSUFMX0lEIiwiVFdfVFdPUkNBX0lEIiwiQU1fQVVUT1JfSUQiLCJBTV9OQVpXSVNLTyIsIkFNX0lNSUUiLCJaQV9UWVRVTCIsIlpBX1RZVFVMX09SWUdJTkFMVSIsIlpBX0pFWllLX09SWUdJTkFMVSIsIk9TX09TT0JBX0lEIiwiT1NfTkFaV0lTS08iLCJPU19JTUlFIiwiZm9fc3ltYm9sIiwiemFfb3Bpc193c3BvbHR3b3Jjb3ciLCJ3eWRhbmllIiwiemFfdG9teSIsImluc3R5dHVjamEiLCJXWV9XWURBV05JQ1RXT19JRCIsIldZX01JQVNUTyIsIldZX05BWldBIiwiemFfcm9rX3d5ZGFuaWEiLCJ6YV9vcGlzX2tzIiwic2VyaWEiLCJUV19OQVpXSVNLTyIsIlRXX0lNSUUiLCJyZWRha3Rvcl9kemlhbHUiLCJaQV9BRE5PVEFDSkUiLCJCTl9VUkwiKSkNCnBvbGFjem9uZSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixwb2xhX3BibCxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl9hdXRvcixieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV90eXR1bCxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV90eXR1bF9vcnlnaW5hbHUsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfamV6eWtfb3J5Z2luYWx1LGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLEJOX3dzcG9sdHdvcmNhLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX29waXNfd3Nwb2x0d29yY293LGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX3d5ZGFuaWUsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfaW5zdHl0dWNqYSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93eWRhd25pY3R3byxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9vcGlzX2tzLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX3NlcmlhX3d5ZGF3bmljemEsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfdG9teSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9hZG5vdGFjamUsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fVVJMLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIHNlbGVjdChhcy52ZWN0b3Ioa29sZWpub3NjJGtvbGVqbm9zYykpDQpjb2xuYW1lcyhwb2xhY3pvbmUpIDwtIGMoInJla29yZF9CTiIsInJ6X25hendhIiwiemFfcm9fcm9rIiwiemFfdHlwZSIsInJ6X3JvZHphal9pZCIsIkRaX05BWldBIiwiRFpfRFpJQUxfSUQiLCJ0d190d29yY2FfaWQiLCJhbV9hdXRvcl9pZCIsImFtX25hendpc2tvIiwiYW1faW1pZSIsInphX3R5dHVsIiwiemFfdHl0dWxfb3J5Z2luYWx1IiwiemFfamV6eWtfb3J5Z2luYWx1Iiwib3Nfb3NvYmFfaWQiLCJvc19uYXp3aXNrbyIsIm9zX2ltaWUiLCJmb19zeW1ib2wiLCJ6YV9vcGlzX3dzcG9sdHdvcmNvdyIsInphX3d5ZGFuaWUiLCJ6YV90b215IiwiemFfaW5zdHl0dWNqYSIsInd5X3d5ZGF3bmljdHdvX2lkIiwid3lfbWllanNjZSIsInd5X25hendhIiwiemFfcm9rX3d5ZGFuaWEiLCJ6YV9vcGlzX2Zpenljem55X2tzaWF6a2kiLCJ6YV9zZXJpYV93eWRhd25pY3phIiwidHdfbmF6d2lza28iLCJ0d19pbWllIiwicHJhY293bmlrIiwiemFfYWRub3RhY2plIiwiQk5fVVJMIikNCg0KI3phc3lnbmFsaXpvd2FuaWUgbmllcG9wcmF3bmVnbyBrb2Rvd2FuaWENCnggPC0gMToobGVuZ3RoKHBvbGFjem9uZSktMikNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgcG9sYWN6b25lJHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoZ3JlcGwoIjxVXFwrKC4uLi4pPiIscG9sYWN6b25lWyxpXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShuY2hhcihwb2xhY3pvbmUkemFfYWRub3RhY2plKSE9MCxwYXN0ZShwb2xhY3pvbmUkemFfYWRub3RhY2plLHBhc3RlKCJVV0FHQSEgQsWCxIVkIGtvZG93YW5pYSB3IHBvbHUgIixhcy5jaGFyYWN0ZXIobmFtZXMocG9sYWN6b25lW2ldKSksIiBabmFqZMW6IGZyYXrEmSBcIj8/P1wiIGkgenJlZGFndWogcG9sZSIsc2VwID0gIiIpLHNlcCA9ICIjICIpLHBhc3RlKCJVV0FHQSEgQsWCxIVkIGtvZG93YW5pYSB3IHBvbHUgIixhcy5jaGFyYWN0ZXIobmFtZXMocG9sYWN6b25lW2ldKSksIiBabmFqZMW6IGZyYXrEmSBcIj8/P1wiIGkgenJlZGFndWogcG9sZSIsc2VwID0gIiIpKSxhcy5jaGFyYWN0ZXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSkpDQogIHBvbGFjem9uZVssaV0gPC0gZ3N1YigiPFVcXCsoLi4uLik+IiwgIj8/PyIsIHBvbGFjem9uZVssaV0pDQp9DQojemFzeWduYWxpem93YW5pZSBvYmVjbm/Fm2NpIHpuYWt1ICQgdyBrdMOzcnltxZsgeiBww7NsDQpYIDwtIDE6KGxlbmd0aChwb2xhY3pvbmUpLTIpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIHBvbGFjem9uZSR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGdyZXBsKCJcXCQiLHBvbGFjem9uZVssaV0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobmNoYXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSk9PTAscGFzdGUoIlVXQUdBISBaZSB3emdsxJlkdSBuYSBixYLEmWRueSB6YXBpcyBCTiB3IHBvbHUgIixhcy5jaGFyYWN0ZXIobmFtZXMocG9sYWN6b25lW2ldKSksIiB3eWRydWtvd2FubyB6bmFrIFwiJFwiLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIikscGFzdGUocG9sYWN6b25lJHphX2Fkbm90YWNqZSxwYXN0ZSgiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGLFgsSZZG55IHphcGlzIEJOIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIHd5ZHJ1a293YW5vIHpuYWsgXCIkXCIuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxzZXAgPSAiIyAiKSksYXMuY2hhcmFjdGVyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpKQ0KfQ0KI3phc3lnbmFsaXpvd2FuaWUgb2JlY25vxZtjaSBmcmF6eSAiY2hhcmFjdGVyKDApIiB3IGt0w7NyeW3FmyB6IHDDs2wNClggPC0gMToobGVuZ3RoKHBvbGFjem9uZSktMikNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgcG9sYWN6b25lJHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoZ3JlcGwoImNoYXJhY3RlclxcKDBcXCkiLHBvbGFjem9uZVssaV0pLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobmNoYXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSk9PTAscGFzdGUoIlVXQUdBISBaZSB3emdsxJlkdSBuYSBixYLEmWRueSB6YXBpcyBCTiB3IHBvbHUgIixhcy5jaGFyYWN0ZXIobmFtZXMocG9sYWN6b25lW2ldKSksIiB3eWRydWtvd2FubyBmcmF6xJkgXCJjaGFyYWN0ZXIoMClcIi4gWnJlZGFndWogdHJlxZvEhyBwb2xhLiIsc2VwID0gIiIpLHBhc3RlKHBvbGFjem9uZSR6YV9hZG5vdGFjamUscGFzdGUoIlVXQUdBISBaZSB3emdsxJlkdSBuYSBixYLEmWRueSB6YXBpcyBCTiB3IHBvbHUgIixhcy5jaGFyYWN0ZXIobmFtZXMocG9sYWN6b25lW2ldKSksIiB3eWRydWtvd2FubyBmcmF6xJkgXCJjaGFyYWN0ZXIoMClcIi4gWnJlZGFndWogdHJlxZvEhyBwb2xhLiIsc2VwID0gIiIpLHNlcCA9ICIjICIpKSxhcy5jaGFyYWN0ZXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSkpDQp9DQojemFzeWduYWxpem93YW5pZSBvYmVjbm/Fm2NpIHpuYWt1ICMgdyBvcGlzaWUgd3Nww7PFgnR3w7NyY8Ozdw0KcG9sYWN6b25lJHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoZ3JlcGwoIlxcIyIscG9sYWN6b25lJHphX29waXNfd3Nwb2x0d29yY293KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG5jaGFyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpPT0wLCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEga29uZmxpa3QgdyBvcGlzaWUgd3Nww7PFgnR3w7NyY8OzdyB3eWJpZXJ6IHfFgmHFm2Npd8SFIHdhcnRvxZvEhyAoc3RyZWZhIG9kcG93aWVkemlhbG5vxZtjaSBcIiNcIiB3c3DDs8WCdHfDs3JjeSB6IHBvbGEgNzAwKSIscGFzdGUocG9sYWN6b25lJHphX2Fkbm90YWNqZSwiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGtvbmZsaWt0IHcgb3Bpc2llIHdzcMOzxYJ0d8OzcmPDs3cgd3liaWVyeiB3xYJhxZtjaXfEhSB3YXJ0b8WbxIcgKHN0cmVmYSBvZHBvd2llZHppYWxub8WbY2kgIyB3c3DDs8WCdHfDs3JjeSB6IHBvbGEgNzAwKSIsc2VwID0gIiMgIikpLGFzLmNoYXJhY3Rlcihwb2xhY3pvbmUkemFfYWRub3RhY2plKSkNCg0Kb3V0IDwtIGNTcGxpdChwb2xhY3pvbmUsIGMoImFtX2F1dG9yX2lkIiwgImFtX25hendpc2tvIiwgImFtX2ltaWUiLCJvc19vc29iYV9pZCIsIm9zX25hendpc2tvIiwgIm9zX2ltaWUiLCAiZm9fc3ltYm9sIiwid3lfd3lkYXduaWN0d29faWQiLCJ3eV9taWVqc2NlIiwid3lfbmF6d2EiKSxzZXAgPSAifCIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgdW5pcXVlKCkNCg0Kb3V0JHJla29yZF9CTiA8LSBpZmVsc2UoaXMubmEob3V0JHJla29yZF9CTiksJycsYXMuY2hhcmFjdGVyKG91dCRyZWtvcmRfQk4pKQ0Kb3V0JHJ6X25hendhIDwtIGlmZWxzZShpcy5uYShvdXQkcnpfbmF6d2EpLCcnLGFzLmNoYXJhY3RlcihvdXQkcnpfbmF6d2EpKQ0Kb3V0JHphX3JvX3JvayA8LSBpZmVsc2UoaXMubmEob3V0JHphX3JvX3JvayksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9yb19yb2spKQ0Kb3V0JHphX3R5cGUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV90eXBlKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3R5cGUpKQ0Kb3V0JHJ6X3JvZHphal9pZCA8LSBpZmVsc2UoaXMubmEob3V0JHJ6X3JvZHphal9pZCksJycsYXMuY2hhcmFjdGVyKG91dCRyel9yb2R6YWpfaWQpKQ0Kb3V0JERaX05BWldBIDwtIGlmZWxzZShpcy5uYShvdXQkRFpfTkFaV0EpLCcnLGFzLmNoYXJhY3RlcihvdXQkRFpfTkFaV0EpKQ0Kb3V0JERaX0RaSUFMX0lEIDwtIGlmZWxzZShpcy5uYShvdXQkRFpfRFpJQUxfSUQpLCcnLGFzLmNoYXJhY3RlcihvdXQkRFpfRFpJQUxfSUQpKQ0Kb3V0JHR3X3R3b3JjYV9pZCA8LSBpZmVsc2UoaXMubmEob3V0JHR3X3R3b3JjYV9pZCksJycsYXMuY2hhcmFjdGVyKG91dCR0d190d29yY2FfaWQpKQ0Kb3V0JGFtX2F1dG9yX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkYW1fYXV0b3JfaWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkYW1fYXV0b3JfaWQpKQ0Kb3V0JGFtX25hendpc2tvIDwtIGlmZWxzZShpcy5uYShvdXQkYW1fbmF6d2lza28pLCcnLGFzLmNoYXJhY3RlcihvdXQkYW1fbmF6d2lza28pKQ0Kb3V0JGFtX2ltaWUgPC0gaWZlbHNlKGlzLm5hKG91dCRhbV9pbWllKSwnJyxhcy5jaGFyYWN0ZXIob3V0JGFtX2ltaWUpKQ0Kb3V0JHphX3R5dHVsIDwtIGlmZWxzZShpcy5uYShvdXQkemFfdHl0dWwpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfdHl0dWwpKQ0Kb3V0JHphX3R5dHVsX29yeWdpbmFsdSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3R5dHVsX29yeWdpbmFsdSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV90eXR1bF9vcnlnaW5hbHUpKQ0Kb3V0JHphX2plenlrX29yeWdpbmFsdSA8LSBpZmVsc2UoaXMubmEob3V0JHphX2plenlrX29yeWdpbmFsdSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9qZXp5a19vcnlnaW5hbHUpKQ0Kb3V0JG9zX29zb2JhX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkb3Nfb3NvYmFfaWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkb3Nfb3NvYmFfaWQpKQ0Kb3V0JG9zX25hendpc2tvIDwtIGlmZWxzZShpcy5uYShvdXQkb3NfbmF6d2lza28pLCcnLGFzLmNoYXJhY3RlcihvdXQkb3NfbmF6d2lza28pKQ0Kb3V0JG9zX2ltaWUgPC0gaWZlbHNlKGlzLm5hKG91dCRvc19pbWllKSwnJyxhcy5jaGFyYWN0ZXIob3V0JG9zX2ltaWUpKQ0Kb3V0JGZvX3N5bWJvbCA8LSBpZmVsc2UoaXMubmEob3V0JGZvX3N5bWJvbCksJycsYXMuY2hhcmFjdGVyKG91dCRmb19zeW1ib2wpKQ0Kb3V0JHphX29waXNfd3Nwb2x0d29yY293IDwtIGlmZWxzZShpcy5uYShvdXQkemFfb3Bpc193c3BvbHR3b3Jjb3cpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfb3Bpc193c3BvbHR3b3Jjb3cpKQ0Kb3V0JHphX3d5ZGFuaWUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV93eWRhbmllKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3d5ZGFuaWUpKQ0Kb3V0JHphX3RvbXkgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV90b215KSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3RvbXkpKQ0Kb3V0JHphX2luc3R5dHVjamEgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9pbnN0eXR1Y2phKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX2luc3R5dHVjamEpKQ0Kb3V0JHd5X3d5ZGF3bmljdHdvX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkd3lfd3lkYXduaWN0d29faWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkd3lfd3lkYXduaWN0d29faWQpKQ0Kb3V0JHd5X21pZWpzY2UgPC0gaWZlbHNlKGlzLm5hKG91dCR3eV9taWVqc2NlKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHd5X21pZWpzY2UpKQ0Kb3V0JHd5X25hendhIDwtIGlmZWxzZShpcy5uYShvdXQkd3lfbmF6d2EpLCcnLGFzLmNoYXJhY3RlcihvdXQkd3lfbmF6d2EpKQ0Kb3V0JHphX3Jva193eWRhbmlhIDwtIGlmZWxzZShpcy5uYShvdXQkemFfcm9rX3d5ZGFuaWEpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfcm9rX3d5ZGFuaWEpKQ0Kb3V0JHphX29waXNfZml6eWN6bnlfa3NpYXpraSA8LSBpZmVsc2UoaXMubmEob3V0JHphX29waXNfZml6eWN6bnlfa3NpYXpraSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9vcGlzX2Zpenljem55X2tzaWF6a2kpKQ0Kb3V0JHphX3NlcmlhX3d5ZGF3bmljemEgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9zZXJpYV93eWRhd25pY3phKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3NlcmlhX3d5ZGF3bmljemEpKQ0Kb3V0JHR3X25hendpc2tvIDwtIGlmZWxzZShpcy5uYShvdXQkdHdfbmF6d2lza28pLCcnLGFzLmNoYXJhY3RlcihvdXQkdHdfbmF6d2lza28pKQ0Kb3V0JHR3X2ltaWUgPC0gaWZlbHNlKGlzLm5hKG91dCR0d19pbWllKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHR3X2ltaWUpKQ0Kb3V0JHByYWNvd25payA8LSBpZmVsc2UoaXMubmEob3V0JHByYWNvd25payksJycsYXMuY2hhcmFjdGVyKG91dCRwcmFjb3duaWspKQ0Kb3V0JHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoaXMubmEob3V0JHphX2Fkbm90YWNqZSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9hZG5vdGFjamUpKQ0Kb3V0JEJOX1VSTCA8LSBpZmVsc2UoaXMubmEob3V0JEJOX1VSTCksJycsYXMuY2hhcmFjdGVyKG91dCRCTl9VUkwpKQ0KDQpvdXQgJSQlICANCiAgICB7IHJla29yZF9CTj09bGFnKHJla29yZF9CTiwpICYgcnpfbmF6d2E9PWxhZyhyel9uYXp3YSwpICYgemFfcm9fcm9rPT1sYWcoemFfcm9fcm9rLCkgJiB6YV90eXBlPT1sYWcoemFfdHlwZSwpICYgcnpfcm9kemFqX2lkPT1sYWcocnpfcm9kemFqX2lkLCkgJiBEWl9OQVpXQT09bGFnKERaX05BWldBLCkgJiBEWl9EWklBTF9JRD09bGFnKERaX0RaSUFMX0lELCkgJiB0d190d29yY2FfaWQ9PWxhZyh0d190d29yY2FfaWQsKSAmIHphX3R5dHVsPT1sYWcoemFfdHl0dWwsKSAmIHphX3R5dHVsX29yeWdpbmFsdT09bGFnKHphX3R5dHVsX29yeWdpbmFsdSwpICYgemFfamV6eWtfb3J5Z2luYWx1PT1sYWcoemFfamV6eWtfb3J5Z2luYWx1LCkgJiB6YV9vcGlzX3dzcG9sdHdvcmNvdz09bGFnKHphX29waXNfd3Nwb2x0d29yY293LCkgJiB6YV93eWRhbmllPT1sYWcoemFfd3lkYW5pZSwpICYgemFfdG9teT09bGFnKHphX3RvbXksKSAmIHphX2luc3R5dHVjamE9PWxhZyh6YV9pbnN0eXR1Y2phLCkgJiB6YV9yb2tfd3lkYW5pYT09bGFnKHphX3Jva193eWRhbmlhLCkgJiB6YV9vcGlzX2Zpenljem55X2tzaWF6a2k9PWxhZyh6YV9vcGlzX2Zpenljem55X2tzaWF6a2ksKSAmIHphX3NlcmlhX3d5ZGF3bmljemE9PWxhZyh6YV9zZXJpYV93eWRhd25pY3phLCkgJiB0d19uYXp3aXNrbz09bGFnKHR3X25hendpc2tvLCkgJiB0d19pbWllPT1sYWcodHdfaW1pZSwpICYgcHJhY293bmlrPT1sYWcocHJhY293bmlrLCkgJiB6YV9hZG5vdGFjamU9PWxhZyh6YV9hZG5vdGFjamUsKSAmIEJOX1VSTD09bGFnKEJOX1VSTCwpfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gb3V0JHNhbWUNCm91dCRzYW1lWzFdIDwtIDANCm91dCRkemllbG9uZSA8LSBwYXN0ZShvdXQkYW1fYXV0b3JfaWQsb3V0JGFtX25hendpc2tvLG91dCRhbV9pbWllLG91dCRvc19vc29iYV9pZCxvdXQkb3NfbmF6d2lza28sb3V0JG9zX2ltaWUsb3V0JGZvX3N5bWJvbCxvdXQkd3lfd3lkYXduaWN0d29faWQsb3V0JHd5X21pZWpzY2Usb3V0JHd5X25hendhLHNlcCA9ICIiKQ0KDQpvdXQgPC0gb3V0ICU+JQ0KICBmaWx0ZXIoIShzYW1lPT0xJmR6aWVsb25lPT0iIikpICU+JQ0KICBzZWxlY3QoMTozMykNCg0Kb3V0ICUkJSAgDQogICAgeyByZWtvcmRfQk49PWxhZyhyZWtvcmRfQk4sKSAmIHJ6X25hendhPT1sYWcocnpfbmF6d2EsKSAmIHphX3JvX3Jvaz09bGFnKHphX3JvX3JvaywpICYgemFfdHlwZT09bGFnKHphX3R5cGUsKSAmIHJ6X3JvZHphal9pZD09bGFnKHJ6X3JvZHphal9pZCwpICYgRFpfTkFaV0E9PWxhZyhEWl9OQVpXQSwpICYgRFpfRFpJQUxfSUQ9PWxhZyhEWl9EWklBTF9JRCwpICYgdHdfdHdvcmNhX2lkPT1sYWcodHdfdHdvcmNhX2lkLCkgJiB6YV90eXR1bD09bGFnKHphX3R5dHVsLCkgJiB6YV90eXR1bF9vcnlnaW5hbHU9PWxhZyh6YV90eXR1bF9vcnlnaW5hbHUsKSAmIHphX2plenlrX29yeWdpbmFsdT09bGFnKHphX2plenlrX29yeWdpbmFsdSwpICYgemFfb3Bpc193c3BvbHR3b3Jjb3c9PWxhZyh6YV9vcGlzX3dzcG9sdHdvcmNvdywpICYgemFfd3lkYW5pZT09bGFnKHphX3d5ZGFuaWUsKSAmIHphX3RvbXk9PWxhZyh6YV90b215LCkgJiB6YV9pbnN0eXR1Y2phPT1sYWcoemFfaW5zdHl0dWNqYSwpICYgemFfcm9rX3d5ZGFuaWE9PWxhZyh6YV9yb2tfd3lkYW5pYSwpICYgemFfb3Bpc19maXp5Y3pueV9rc2lhemtpPT1sYWcoemFfb3Bpc19maXp5Y3pueV9rc2lhemtpLCkgJiB6YV9zZXJpYV93eWRhd25pY3phPT1sYWcoemFfc2VyaWFfd3lkYXduaWN6YSwpICYgdHdfbmF6d2lza289PWxhZyh0d19uYXp3aXNrbywpICYgdHdfaW1pZT09bGFnKHR3X2ltaWUsKSAmIHByYWNvd25paz09bGFnKHByYWNvd25paywpICYgemFfYWRub3RhY2plPT1sYWcoemFfYWRub3RhY2plLCkgJiBCTl9VUkw9PWxhZyhCTl9VUkwsKX0gJT4lIA0KICAgIGFzLm51bWVyaWMoKSAlPiUgDQogICAgey59IC0+IG91dCRzYW1lDQoNCiN1Y2nEmWNpZSB6Ynl0IGTFgnVnaWNoIGNpxIVnw7N3IHpuYWvDs3csIGJ5IHdlc3rFgnkgZG8gb3JhY2xlJ2ENCmRsdWdvc2NpIDwtIGRhdGEuZnJhbWUocG9sZSA9IGMoImFtX25hendpc2tvIiwgImFtX2ltaWUiLCAiemFfdHl0dWwiLCAiemFfdHl0dWxfb3J5Z2luYWx1IiwgInphX2plenlrX29yeWdpbmFsdSIsICJvc19uYXp3aXNrbyIsICJvc19pbWllIiwgInphX29waXNfd3Nwb2x0d29yY293IiwgInphX2luc3R5dHVjamEiLCAid3lfbWllanNjZSIsICJ3eV9uYXp3YSIsICJ6YV9vcGlzX2Zpenljem55X2tzaWF6a2kiLCAiemFfc2VyaWFfd3lkYXduaWN6YSIsICJ0d19uYXp3aXNrbyIsICJ0d19pbWllIiwgInphX2Fkbm90YWNqZSIpLCBsaWN6YmFfem5ha293ID0gYyg1MCw0MCw1MDAsNTAwLDEwMCw1MCw0MCw1MDAsMjU1LDQwLDI1NSwxMDAwLDI1NSwyMDAsNDAsMjAwMCkpDQp4IDwtIG1hdGNoKGRsdWdvc2NpJHBvbGUsbmFtZXMob3V0KSkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgZGx1Z29zYyA8LSBkbHVnb3NjaSRsaWN6YmFfem5ha293W21hdGNoKG5hbWVzKG91dFtpXSksZGx1Z29zY2kkcG9sZSldDQogIG91dCR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGRsdWdvc2M8bmNoYXIoYXMuY2hhcmFjdGVyKG91dFssaV0pKSZvdXQkemFfYWRub3RhY2plIT0iIixwYXN0ZShvdXQkemFfYWRub3RhY2plLHBhc3RlKCJVV0FHQSEgUG9sZSAiLGFzLmNoYXJhY3RlcihuYW1lcyhvdXRbaV0pKSwiIGJ5xYJvIHpieXQgZMWCdWdpZSBpIHpvc3RhxYJvIHByenljacSZdGUuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxzZXAgPSAiIyAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRsdWdvc2M8bmNoYXIoYXMuY2hhcmFjdGVyKG91dFssaV0pKSZvdXQkemFfYWRub3RhY2plPT0iIixwYXN0ZSgiVVdBR0EhIFBvbGUgIixhcy5jaGFyYWN0ZXIobmFtZXMob3V0W2ldKSksIiBiecWCbyB6Ynl0IGTFgnVnaWUgaSB6b3N0YcWCbyBwcnp5Y2nEmXRlLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIiksYXMuY2hhcmFjdGVyKG91dCR6YV9hZG5vdGFjamUpKSkNCiAgDQogIG91dFssaV0gPC0gaWZlbHNlKGRsdWdvc2M8bmNoYXIoYXMuY2hhcmFjdGVyKG91dFssaV0pKSxhcy5jaGFyYWN0ZXIoc3Vic3RyKG91dFssaV0sMSxkbHVnb3NjKSksYXMuY2hhcmFjdGVyKG91dFssaV0pKQ0KfQ0KDQpvdXQkcmVrb3JkX0JOW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkcnpfbmF6d2Fbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9yb19yb2tbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV90eXBlW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkcnpfcm9kemFqX2lkW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkRFpfTkFaV0Fbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCREWl9EWklBTF9JRFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHR3X3R3b3JjYV9pZFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3R5dHVsW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfdHl0dWxfb3J5Z2luYWx1W291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfamV6eWtfb3J5Z2luYWx1W291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfb3Bpc193c3BvbHR3b3Jjb3dbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV93eWRhbmllW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfdG9teVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX2luc3R5dHVjamFbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9yb2tfd3lkYW5pYVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX29waXNfZml6eWN6bnlfa3NpYXpraVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3NlcmlhX3d5ZGF3bmljemFbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR0d19uYXp3aXNrb1tvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHR3X2ltaWVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCRwcmFjb3duaWtbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9hZG5vdGFjamVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCRCTl9VUkxbb3V0JHNhbWUgPT0gMV0gPC0gIiINCg0Kb3V0IDwtIG91dCAlPiUNCiAgc2VsZWN0KDE6MzMpDQoNCiNwxJl0bGEgemFwaXN1asSFY2EgcG8gb2suIDIwMDAgd2llcnN6eSB6IHV3emdsxJlkbmllbmllbSBrb21wbGV0bm/Fm2NpIHJla29yZMOzdyBiaWJsaW9ncmFmaWN6bnljaCByb3pwaXNhbnljaCBuYSBraWxrYSB3aWVyc3p5DQpvdXQgPC0gb3V0ICU+JQ0KICBtdXRhdGUocG9kemlhbCA9IGlmZWxzZShyZWtvcmRfQk4hPSIiLGFzLmNoYXJhY3RlcihyZWtvcmRfQk4pLE5BKSkgJT4lDQogIGZpbGwocG9kemlhbCkNCmlsZSA8LSB1bmlxdWUob3V0JHBvZHppYWwpDQppbGUgPC0gc3BsaXQodW5pcXVlKGlsZSksIGNlaWxpbmcoc2VxX2Fsb25nKHVuaXF1ZShpbGUpKS8xNTAwKSkNCnggPC0gMTpsZW5ndGgoaWxlKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICBmaW5hbCA8LSBvdXQgJT4lDQogICAgZmlsdGVyKHBvZHppYWwgJWluJSBpbGVbW2ldXSkgJT4lDQogICAgc2VsZWN0KC1wb2R6aWFsKQ0KICB3cml0ZS54bHN4KGZpbmFsLCBwYXN0ZSgiQzovVXNlcnMvIixlbXBsb3llZV9uYW1lLCIvRGVza3RvcC8iLGltcG9ydF95ZWFyLCJfcHJ6ZWRtaW90b3dhX2RvX2ltcG9ydHUiLGksIi54bHN4IixzZXAgPSAiIiksc2hlZXROYW1lID0gImdvdG93ZSIpDQp9DQpgYGANCg0KYGBge3Iga3NpxIXFvGtpIGFudG9sb2dpZX0NCmJuX29rIDwtIGNodW5rMTENCmRhdGEgPC0gYm5fb2sgJT4lDQogIGZpbHRlcihyb2R6YWpfa3NpYXpraT09ImFudG9sb2dpYSIpICU+JQ0KICBtdXRhdGUocmVkYWt0b3JfZHppYWx1ID0gcGFzdGUocmVkYWt0b3JfZHppYWx1LCJfYW50IixzZXAgPSAiIikpDQojdXdvbG5pZW5pZSBrb2x1bW4geiBkYW55bWkgeiBibiBpIHByemV0d29yemVuaWUgZG8gUEJMDQojMTogemFfdXdhZ2ksIHJ6X25hendhLCB6YV9yb19yb2ssIHphX3R5cGUsIHJ6X3JvZHphal9pZCwgdHdfdHdvcmNhX2lkLCB0d19uYXp3aXNrbywgdHdfaW1pZSwgZHpfZHppYWxfaWQsIGR6X25hendhLCByZWRha3Rvcl9kemlhbHUNCnBvbGFfcGJsIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSwgUlpfTkFaV0EsIFpBX1JPX1JPSyA9IHJvaywgUlpfUk9EWkFKX0lELCBUV19UV09SQ0FfSUQsIFRXX05BWldJU0tPLCBUV19JTUlFLCBEWl9EWklBTF9JRCwgRFpfTkFaV0EsIHJlZGFrdG9yX2R6aWFsdSkgJT4lDQogIG11dGF0ZShaQV9UWVBFID0gIktTIikNCiMyOiBhdXRvcg0KQk5fYXV0b3IgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKEFNX0FVVE9SX0lEID0gTkEsDQogICAgICAgICBBTV9OQVpXSVNLTyA9IE5BLA0KICAgICAgICAgQU1fSU1JRSA9IE5BKQ0KDQojYWRub3RhY2plIHogYXV0b3LDs3cNCiN3IGFudG9sb2dpaSBhZG5vdGFjamEgbXVzaSBiecSHIHdjemXFm25pZWosIMW8ZWJ5IG5hIGfDs3J6ZSBiecWCbyBpbmZvIG8gdGVrc3RhY2ggYXV0b3LDs3cNCg0KWkFfQUROT1RBQ0pFIDwtIGRhdGEgJT4lDQogIHNlbGVjdChYMTAwLFgyNDUsWkFfVVdBR0kpDQojcG9sZSAxMDANCm1hcmNfZmllbGRfMTAwIDwtIFpBX0FETk9UQUNKRSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgxMDApJT4lDQogIGZpbHRlcihYMTAwIT0iIikgJT4lDQogIG11dGF0ZShYMTAwPXN0cl9yZXBsYWNlX2FsbChYMTAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgxMDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDEwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDEwMD1zdHJfcmVtb3ZlX2FsbChYMTAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgxMDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoWkFfQUROT1RBQ0pFJFgxMDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8xMDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMTAwPC1jYmluZChtYXJjX2ZpZWxkXzEwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzEwMCRYMTAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMTAwJFgxMDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMTAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMTAwJFgxMDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzEwMCRYMTAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCiN0dXRhaiBtb8W8ZSBiecSHIGLFgsSFZCB6ZSB3emdsxJlkdSBuYSBicmFrIGtvbHVtbnkgJGIsIHd0ZWR5IG5hbGXFvHkgem1pZW5pxIcgbGluacSZIHogc2VsZWN0ZW0gaSB6YWtvbWVudG93YcSHIGxpbmnEmTogbXV0YXRlKGAkYWAgPSBpZmVsc2UoIWlzLm5hKGAkYmApLHBhc3RlKGAkYWAsYCRiYCxzZXAgPSAiICIpLGFzLmNoYXJhY3RlcihgJGFgKSkpICU+JQ0KWkFfQUROT1RBQ0pFIDwtIG1hcmNfZmllbGRfMTAwICU+JQ0KICAjc2VsZWN0KFpBX1VXQUdJLGAkYWAsYCRiYCkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogICNtdXRhdGUoYCRhYCA9IGlmZWxzZSghaXMubmEoYCRiYCkscGFzdGUoYCRhYCxgJGJgLHNlcCA9ICIgIiksYXMuY2hhcmFjdGVyKGAkYWApKSkgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlbW92ZShgJGFgLCIoPzw9W2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKShcXC4kKSIpKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShBTV9OQVpXSVNLTyA9IGlmZWxzZShncmVwbCgiXFx8IixgJGFgKSwgc3RyX3JlcGxhY2VfYWxsKHN0cl9yZW1vdmVfYWxsKGAkYWAsIiwiKSwiXFx8IiwiLCAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiLCIsYCRhYCksc3RyX3JlcGxhY2VfYWxsKGAkYWAsIiguKj8pKCwgKSguKikiLCJcXDEiKSxhcy5jaGFyYWN0ZXIoYCRhYCkpKSwNCiAgICAgICAgIEFNX0lNSUUgPSBpZmVsc2UoZ3JlcGwoIlxcfCIsYCRhYCksIioiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIiwiLGAkYWApLHN0cl9yZXBsYWNlX2FsbChgJGFgLCIoLio/KSgsICkoLiopIiwiXFwzIiksIioiKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksQU1fTkFaV0lTS08sQU1fSU1JRSkgJT4lDQogIHVuaXRlKCJaQV9BRE5PVEFDSkUiLCBBTV9JTUlFOkFNX05BWldJU0tPLCBzZXAgPSAiICIpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShaQV9BRE5PVEFDSkUgPSBwYXN0ZSgiW1Rla3N0eSBhdXQuOl0iLHBhc3RlKFpBX0FETk9UQUNKRSxjb2xsYXBzZSA9ICIsICIpLHNlcCA9ICIgIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojMzogdHl0dcWCDQojcG9sZSAyNDUNCm1hcmNfZmllbGRfMjQ1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1KSU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJ+IiksDQogICAgICAgICBYMjQ1PXN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNDUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNDUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjQ1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI0NTwtY2JpbmQobWFyY19maWVsZF8yNDUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNDUkWDI0NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI0NSRYMjQ1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI0NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI0NSRYMjQ1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNDUkWDI0NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzI0NSA8LSBtYXJjX2ZpZWxkXzI0NSAlPiUNCiBzZWxlY3QoWkFfVVdBR0ksYCRhYCxgJGJgLGAkbmAsYCRwYCkgJT4lDQogZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KIG11dGF0ZShgJGFgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksY29sbGFwc2UgPSAiICIpLA0KICAgICAgICBgJGJgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYmApLCIiLGFzLmNoYXJhY3RlcihgJGJgKSksY29sbGFwc2UgPSAiICIpLA0KICAgICAgICBgJG5gID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkbmApLCIiLGFzLmNoYXJhY3RlcihgJG5gKSksY29sbGFwc2UgPSAiICIpLA0KICAgICAgICBgJHBgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkcGApLCIiLGFzLmNoYXJhY3RlcihgJHBgKSksY29sbGFwc2UgPSAiICIpKSAlPiUNCiB1bmdyb3VwKCkgJT4lDQogdW5pcXVlKCkgJT4lDQogdW5pdGUoIlpBX1RZVFVMIixgJGFgOmAkcGAsc2VwID0gIiAiLG5hLnJtID0gVFJVRSkgJT4lDQogbXV0YXRlKFpBX1RZVFVMID0gc3RyX3JlcGxhY2VfYWxsKFpBX1RZVFVMLCIgKyIsIiAiKSwNCiAgICAgICAgWkFfVFlUVUwgPSBzdHJfcmVtb3ZlKFpBX1RZVFVMLCAiXFxzK1xcL1xcc3swLH0kIiksDQogICAgICAgIFpBX1RZVFVMID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWkFfVFlUVUwpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsWkFfVFlUVUwpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLGFzLmNoYXJhY3RlcihaQV9UWVRVTCkpKSkpLA0KICAgICAgICBaQV9UWVRVTCA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWkFfVFlUVUwpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLFpBX1RZVFVMKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKSguKSIsWkFfVFlUVUwpLGdzdWIoIihcXFcpKCApKDp8OykoICkoLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSxhcy5jaGFyYWN0ZXIoWkFfVFlUVUwpKSkpKSwNCiAgICAgICAgWkFfVFlUVUwgPSBzdHJfcmVwbGFjZV9hbGwoWkFfVFlUVUwsIlxcLnszfSBcXC57M30iLCIuLi4gIiksDQogICAgICAgIFpBX1RZVFVMID0gc3RyX3JlcGxhY2VfYWxsKFpBX1RZVFVMLCIgOyAiLCIuICIpLA0KICAgICAgICBaQV9UWVRVTCA9IGdzdWIoIiggOiApKC4pIiwiLiBcXFVcXDIiLHBlcmw9VFJVRSxaQV9UWVRVTCkpICU+JQ0KIHNlbGVjdChaQV9VV0FHSSxaQV9UWVRVTCkNCiNkb3Bpc2FuaWUgZ2F0dW5rdSBkbyBwcnplZG1pb3Rvd2VqIG5hIHBvZHN0YXdpZSA2NTUgaSA2NTAgIA0KZ2F0dW5raV9wYmwgPC0gZGF0YS5mcmFtZShnYXR1bmVrID0gYygiYWZvcnl6bSIsICJhbGJ1bSIsICJhbnRvbG9naWEiLCAiYXV0b2Jpb2dyYWZpYSIsICJkemllbm5payIsICJlc2VqIiwgImZlbGlldG9uIiwgImlubmUiLCAia2F6YW5pZSIsICJsaXN0IiwgIm1pbmlhdHVyYSBwcm96xIUiLCAib3Bvd2lhZGFuaWUiLCAicG9lbWF0IiwgInBvd2llxZvEhyIsICJwcm96YSIsICJwcm96YSBwb2V0eWNrYSIsICJyZXBvcnRhxbwiLCAicm96bXnFm2xhbmllIHJlbGlnaWpuZSIsICJyeXN1bmVrLCBvYnJheiIsICJzY2VuYXJpdXN6IiwgInN6a2ljIiwgInRla3N0IGJpYmxpam55IiwgInRla3N0IGRyYW1hdHljem55IiwgImRyYW1hdCIsICJ3aWVyc3oiLCAid3Nwb21uaWVuaWEiLCAid3lwb3dpZWTFuiIsICJwYW1pxJl0bmlraSIsICJwb2V6amEiLCAibGl0ZXJhdHVyYSBwb2Ryw7PFvG5pY3phIiwgInNhdHlyYSIsICJwaW9zZW5rYSIpKQ0KDQojZHJhbWF0LCBwYW1pxJl0bmlraSwgcG9lemphLCBsaXRlcmF0dXJhIHBvZHLDs8W8bmljemEsIHNhdHlyYSwgcGlvc2Vua2ENCmdhdHVua2lfYm4gPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg2NTUsWDY1MCkNCg0KZ2F0dW5raV9ibiA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgZnJvbSBnYXR1bmtpX2JuDQogICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBnYXR1bmtpX3BibCBvbiBsb3dlcihnYXR1bmtpX2JuLlg2NTUpIGxpa2UgJyUnfHxnYXR1bmtpX3BibC5nYXR1bmVrfHwnJSciKQ0KZ2F0dW5raV9ibiA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgICBmcm9tIGdhdHVua2lfYm4NCiAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gZ2F0dW5raV9wYmwgb24gbG93ZXIoZ2F0dW5raV9ibi5YNjUwKSBsaWtlICclJ3x8Z2F0dW5raV9wYmwuZ2F0dW5la3x8JyUnIikNCmNvbG5hbWVzKGdhdHVua2lfYm4pWzVdIDwtICJnYXR1bmVrMiINCmdhdHVua2lfYm4gPC0gZ2F0dW5raV9ibiAlPiUNCiAgbXV0YXRlKGdhdHVuZWsgPSBpZmVsc2UoaXMubmEoZ2F0dW5laykmIWlzLm5hKGdhdHVuZWsyKSxhcy5jaGFyYWN0ZXIoZ2F0dW5lazIpLGFzLmNoYXJhY3RlcihnYXR1bmVrKSkpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGdhdHVuZWspKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGdhdHVuZWspICU+JQ0KICBtdXRhdGUoZ2F0dW5layA9IGlmZWxzZShnYXR1bmVrPT0iZHJhbWF0IiwidGVrc3QgZHJhbWF0eWN6bnkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2F0dW5laz09InBhbWnEmXRuaWtpIiwid3Nwb21uaWVuaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdhdHVuZWs9PSJwb2V6amEiLCJ3aWVyc3oiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnYXR1bmVrPT0ibGl0ZXJhdHVyYSBwb2Ryw7PFvG5pY3phIiwicmVwb3J0YcW8IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdhdHVuZWs9PSJwaW9zZW5rYSIsIndpZXJzeiIsYXMuY2hhcmFjdGVyKGdhdHVuZWspKSkpKSkpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShnYXR1bmVrID0gcGFzdGUoZ2F0dW5layxjb2xsYXBzZSA9ICIsICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKGdhdHVuZWsgPSBnc3ViKCIoXi4pIiwiXFxVXFwxIixwZXJsID0gVFJVRSwgZ2F0dW5laykpDQojcG/FgsSFY3plbmllIHR5dHXFgnUgeiBnYXR1bmtpZW0NCnphX3R5dHVsIDwtIG1hcmNfZmllbGRfMjQ1ICU+JQ0KICBsZWZ0X2pvaW4oLixnYXR1bmtpX2JuLGJ5PSJaQV9VV0FHSSIpICU+JSANCiAgbXV0YXRlKGdhdHVuZWsgPSBwYXN0ZSgiWyIsZ2F0dW5laywiXSIsc2VwID0gIiIpLA0KICAgICAgICAgZ2F0dW5layA9IGlmZWxzZShnYXR1bmVrPT0iW05BXSIsTkEsYXMuY2hhcmFjdGVyKGdhdHVuZWspKSkgJT4lIA0KICB1bml0ZSgiWkFfVFlUVUwiLCBaQV9UWVRVTDpnYXR1bmVrLCBzZXAgPSAiLiAiLG5hLnJtPVRSVUUpICU+JSANCiAgbXV0YXRlKFpBX1RZVFVMID0gc3RyX3JlcGxhY2VfYWxsKFpBX1RZVFVMLCJcXC4gXFwuIiwiLiAiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gc3RyX3JlcGxhY2UoWkFfVFlUVUwsIihcXCEpKFxcLil8KFxcPykoXFwuKSIsIlxcMSIpKQ0KIzQ6IHR5dHXFgiBvcnlnaW5hxYJ1DQojcG9sZSAyNDYNCm1hcmNfZmllbGRfMjQ2IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ2KSU+JQ0KICBmaWx0ZXIoWDI0NiE9IiIpICU+JQ0KICBtdXRhdGUoWDI0Nj1zdHJfcmVtb3ZlX2FsbChYMjQ2LCJ+IiksDQogICAgICAgICBYMjQ2PXN0cl9yZXBsYWNlX2FsbChYMjQ2LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNDYiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI0NiE9IiIpICU+JQ0KICBtdXRhdGUoWDI0Nj1zdHJfcmVtb3ZlX2FsbChYMjQ2LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNDYsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ2LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjQ2KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI0NjwtY2JpbmQobWFyY19maWVsZF8yNDYsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNDYkWDI0NiA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI0NiRYMjQ2LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI0NlssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI0NiRYMjQ2KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNDYkWDI0NiksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQppZigiJG4iICVpbiUgY29sbmFtZXMobWFyY19maWVsZF8yNDUpKSB7DQptYXJjX2ZpZWxkXzI0NiA8LSBtYXJjX2ZpZWxkXzI0NiAlPiUNCiBmaWx0ZXIoZ3JlcGwoIm9yeWciLFgyNDYpKSAlPiUNCiBzZWxlY3QoWkFfVVdBR0ksYCRhYCxgJGJgLGAkbmAsYCRwYCkgJT4lDQogZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KIG11dGF0ZShgJGFgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksY29sbGFwc2UgPSAiLCAiKSwNCiAgICAgICAgYCRiYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGJgKSwiIixhcy5jaGFyYWN0ZXIoYCRiYCkpLGNvbGxhcHNlID0gIiIpLA0KICAgICAgICBgJG5gID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkbmApLCIiLGFzLmNoYXJhY3RlcihgJG5gKSksY29sbGFwc2UgPSAiIiksDQogICAgICAgIGAkcGAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRwYCksIiIsYXMuY2hhcmFjdGVyKGAkcGApKSxjb2xsYXBzZSA9ICIiKSkgJT4lDQogdW5ncm91cCgpICU+JQ0KIHVuaXF1ZSgpICU+JQ0KIHVuaXRlKCJYMjQ2IixgJGFgOmAkcGAsc2VwID0gIiAiLG5hLnJtID0gVFJVRSkgJT4lDQogbXV0YXRlKFgyNDYgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NiwiICsiLCIgIiksDQogICAgICAgIFgyNDYgPSBzdHJfcmVtb3ZlKFgyNDYsICJcXHMrXFwvXFxzezAsfSQiKSwNCiAgICAgICAgWDI0NiA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSxhcy5jaGFyYWN0ZXIoWDI0NikpKSkpLA0KICAgICAgICBYMjQ2ID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICl7MCwxfSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKXswLDF9KC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSxhcy5jaGFyYWN0ZXIoWDI0NikpKSkpLA0KICAgICAgICBYMjQ2ID0gc3RyX3JlcGxhY2VfYWxsKFgyNDYsIlxcLnszfSBcXC57M30iLCIuLi4gIiksDQogICAgICAgIFgyNDYgPSBnc3ViKCIoIDogKSguKSIsIi4gXFxVXFwyIixwZXJsPVRSVUUsWDI0NikpICU+JQ0KIHNlbGVjdChaQV9VV0FHSSwgWDI0NikNCn0gZWxzZSB7DQogIG1hcmNfZmllbGRfMjQ2IDwtIG1hcmNfZmllbGRfMjQ2ICU+JQ0KIGZpbHRlcihncmVwbCgib3J5ZyIsWDI0NikpICU+JQ0KIHNlbGVjdChaQV9VV0FHSSxgJGFgLGAkYmApICU+JQ0KIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiBtdXRhdGUoYCRhYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGFgKSwiIixhcy5jaGFyYWN0ZXIoYCRhYCkpLGNvbGxhcHNlID0gIiwgIiksDQogICAgICAgIGAkYmAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRiYCksIiIsYXMuY2hhcmFjdGVyKGAkYmApKSxjb2xsYXBzZSA9ICIiKSkgJT4lDQogdW5ncm91cCgpICU+JQ0KIHVuaXF1ZSgpICU+JQ0KIHVuaXRlKCJYMjQ2IixgJGFgOmAkYmAsc2VwID0gIiAiLG5hLnJtID0gVFJVRSkgJT4lDQogbXV0YXRlKFgyNDYgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NiwiICsiLCIgIiksDQogICAgICAgIFgyNDYgPSBzdHJfcmVtb3ZlKFgyNDYsICJcXHMrXFwvXFxzezAsfSQiKSwNCiAgICAgICAgWDI0NiA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsWDI0NiksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSxhcy5jaGFyYWN0ZXIoWDI0NikpKSkpLA0KICAgICAgICBYMjQ2ID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICl7MCwxfSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKXswLDF9KC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSxhcy5jaGFyYWN0ZXIoWDI0NikpKSkpLA0KICAgICAgICBYMjQ2ID0gc3RyX3JlcGxhY2VfYWxsKFgyNDYsIlxcLnszfSBcXC57M30iLCIuLi4gIiksDQogICAgICAgIFgyNDYgPSBnc3ViKCIoIDogKSguKSIsIi4gXFxVXFwyIixwZXJsPVRSVUUsWDI0NikpICU+JQ0KIHNlbGVjdChaQV9VV0FHSSwgWDI0NikNCn0NCg0KI3BvbGUgNTAwDQptYXJjX2ZpZWxkXzUwMCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDUwMCklPiUNCiAgZmlsdGVyKFg1MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg1MDA9c3RyX3JlbW92ZV9hbGwoWDUwMCwifiIpLA0KICAgICAgICAgWDUwMD1zdHJfcmVwbGFjZV9hbGwoWDUwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNTAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg1MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg1MDA9c3RyX3JlbW92ZV9hbGwoWDUwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNTAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDUwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzUwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF81MDA8LWNiaW5kKG1hcmNfZmllbGRfNTAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNTAwJFg1MDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF81MDAkWDUwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF81MDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF81MDAkWDUwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNTAwJFg1MDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfNTAwIDwtIG1hcmNfZmllbGRfNTAwICU+JQ0KICBmaWx0ZXIoZ3JlcGwoIm9yeWdcXC5cXDoiLFg1MDApKSAlPiUNCiAgbXV0YXRlKFg1MDAgPSBzdHJfcmVtb3ZlKGAkYWAsIl5UeXRcXC4gb3J5Z1xcLjogfF5UeXRcXCwgb3J5Z1xcLjogfF4uKj90eXRcXC4gb3J5Z1xcLjogIiksDQogICAgICAgICBYNTAwID0gc3RyX3JlbW92ZShYNTAwLCAiXFxzK1xcL1xcc3swLH0kIiksDQogICAgICAgICBYNTAwID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYNTAwKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixYNTAwKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLFg1MDApLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixYNTAwKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYNTAwKSxhcy5jaGFyYWN0ZXIoWDUwMCkpKSkpLA0KICAgICAgICAgWDUwMCA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDUwMCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDUwMCksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWDUwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIixYNTAwKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDUwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKSguKSIsWDUwMCksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDUwMCksYXMuY2hhcmFjdGVyKFg1MDApKSkpKSwNCiAgICAgICAgIFg1MDAgPSBzdHJfcmVwbGFjZV9hbGwoWDUwMCwiXFwuezN9IFxcLnszfSIsIi4uLiAiKSwNCiAgICAgICAgIFg1MDAgPSBzdHJfcmVtb3ZlKFg1MDAsICJcXC4kIiksDQogICAgICAgICBYNTAwID0gc3RyX3JlbW92ZShYNTAwLCIoLHswLDF9IHswLDF9KVxcZHs0fS4qJHwoLCB0fC4gVCl5dC4gb3J5Zy4gY3lrbHU6IikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDUwMCkNCiN0eXR1xYIgb3J5Z2luYcWCdQ0KemFfdHl0dWxfb3J5Z2luYWx1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMjQ2LGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzUwMCxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKFg1MDAgPSBpZmVsc2UoaXMubmEoWDUwMCksTkEsDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgib3J5ZyIsWDUwMCksTkEsYXMuY2hhcmFjdGVyKFg1MDApKSksDQogICAgICAgICBYNTAwID0gaWZlbHNlKCFpcy5uYShYNTAwKSZncmVwbCgiXFwuIC0gIixYNTAwKSxzdHJfcmVwbGFjZShYNTAwLCIoLio/KShcXC4gLSAuKiQpIiwiXFwxIiksYXMuY2hhcmFjdGVyKFg1MDApKSwNCiAgICAgICAgIFg1MDAgPSBpZmVsc2UoIWlzLm5hKFg1MDApJmdyZXBsKCJOYSBrc2nEhcW8Y2UgcHNldWQiLFg1MDApLHN0cl9yZXBsYWNlKFg1MDAsIiguKj8pKFxcLiBOYSBrc2nEhcW8Y2UgcHNldWQuKiQpIiwiXFwxIiksYXMuY2hhcmFjdGVyKFg1MDApKSwNCiAgICAgICAgIFg1MDAgPSBpZmVsc2UoIWlzLm5hKFg1MDApJmdyZXBsKCJQcnpla8WCXFwuIHdnIixYNTAwKSxzdHJfcmVwbGFjZShYNTAwLCIoLio/KShcXC4gUHJ6ZWvFglxcLiB3Zy4qJCkiLCJcXDEiKSxhcy5jaGFyYWN0ZXIoWDUwMCkpLA0KICAgICAgICAgWkFfVFlUVUxfT1JZR0lOQUxVID0gaWZlbHNlKGlzLm5hKFgyNDYpJmlzLm5hKFg1MDApLE5BLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSghaXMubmEoWDUwMCksYXMuY2hhcmFjdGVyKFg1MDApLGFzLmNoYXJhY3RlcihYMjQ2KSkpLA0KICAgICAgICAgWkFfVFlUVUxfT1JZR0lOQUxVID0gc3RyX3JlbW92ZV9hbGwoWkFfVFlUVUxfT1JZR0lOQUxVLCdcXCInKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxaQV9UWVRVTF9PUllHSU5BTFUpDQoNCiM1OiBqxJl6eWsgb3J5Z2luYcWCdQ0KbWFyY19maWVsZF8wNDEgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgwNDEpJT4lDQogIGZpbHRlcihYMDQxIT0iIikgJT4lDQogIG11dGF0ZShYMDQxPXN0cl9yZXBsYWNlX2FsbChYMDQxLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgwNDEiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDA0MSE9IiIpICU+JQ0KICBtdXRhdGUoWDA0MT1zdHJfcmVtb3ZlX2FsbChYMDQxLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgwNDEsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMDQxLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMDQxKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzA0MTwtY2JpbmQobWFyY19maWVsZF8wNDEsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8wNDEkWDA0MSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzA0MSRYMDQxLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzA0MVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzA0MSRYMDQxKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8wNDEkWDA0MSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KemFfamV6eWtfb3J5Z2luYWx1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMDQxICU+JSBzZWxlY3QoWkFfVVdBR0ksWkFfSkVaWUtfT1JZR0lOQUxVID0gYCRhYCksYnk9IlpBX1VXQUdJIikgJT4lDQogIG11dGF0ZShaQV9KRVpZS19PUllHSU5BTFUgPSBzdHJfcmVwbGFjZV9hbGwoWkFfSkVaWUtfT1JZR0lOQUxVLCJcXCRhIiwiLCIpKSAlPiUNCiAgdW5pcXVlKCkNCg0KIzY6IHdzcMOzxYJ0d8OzcmN5DQptYXJjX2ZpZWxkXzcwMCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDcwMCklPiUNCiAgZmlsdGVyKFg3MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg3MDA9c3RyX3JlcGxhY2VfYWxsKFg3MDAsIiguLlxcJGEpIiwifFxcMSIpLA0KICAgICAgICAgWDcwMD1zdHJfcmVwbGFjZV9hbGwoWDcwMCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNzAwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg3MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg3MDA9c3RyX3JlbW92ZV9hbGwoWDcwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNzAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpICU+JQ0KICBmaWx0ZXIoWDcwMCE9IiIpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDcwMCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzcwMClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF83MDA8LWNiaW5kKG1hcmNfZmllbGRfNzAwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNzAwJFg3MDAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF83MDAkWDcwMCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF83MDBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF83MDAkWDcwMCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNzAwJFg3MDApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCg0KQk5fd3Nwb2x0d29yY2EgPC0gbWFyY19maWVsZF83MDAgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxvc29iYSA9IGAkYWAsZnVua2NqYSA9IGAkZWApICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGZ1bmtjamEpKSAlPiUNCiAgbXV0YXRlKG9zb2JhID0gc3RyX3JlbW92ZShvc29iYSwiKD88PVthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkoXFwuJCkiKSwNCiAgICAgICAgIE9TX05BWldJU0tPID0gaWZlbHNlKGdyZXBsKCIsIixvc29iYSksc3RyX3JlcGxhY2VfYWxsKG9zb2JhLCIoLio/KSgsICkoLiopIiwiXFwxIiksYXMuY2hhcmFjdGVyKG9zb2JhKSksDQogICAgICAgICBPU19JTUlFID0gaWZlbHNlKGdyZXBsKCIsIixvc29iYSksc3RyX3JlcGxhY2VfYWxsKG9zb2JhLCIoLio/KSgsICkoLiopIiwiXFwzIiksIioiKSwNCiAgICAgICAgIHdzX3Byb3N0eSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfdG9fbG93ZXIob3NvYmEpLCAiXFxXIiwgIiIpLA0KICAgICAgICAgZnVfcHJvc3RhID0gc3RyX3JlcGxhY2VfYWxsKHN0cl90b19sb3dlcihmdW5rY2phKSwgIlxcVyIsICIiKSkgJT4lDQogIGxlZnRfam9pbiguLFBCTF93c3BvbHR3b3JjeSAlPiUgc2VsZWN0KE9TX09TT0JBX0lELE9TX0xJQ1pCQV9aQVBJU09XLG5hendhX3Byb3N0YSksYnk9Yygid3NfcHJvc3R5Ij0ibmF6d2FfcHJvc3RhIikpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLE9TX05BWldJU0tPLE9TX0lNSUUsLU9TX0xJQ1pCQV9aQVBJU09XKQ0KQk5fd3Nwb2x0d29yY2EkaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKEJOX3dzcG9sdHdvcmNhWzE6Ml0pKQ0KQk5fd3Nwb2x0d29yY2EgPC0gQk5fd3Nwb2x0d29yY2FbIWR1cGxpY2F0ZWQoQk5fd3Nwb2x0d29yY2EkaWRfZ3J1cHkpLF0gJT4lDQogIGxlZnRfam9pbiguLFBCTF9mdW5rY2plLGJ5PWMoImZ1X3Byb3N0YSI9Im5hendhIikpICU+JQ0KICBtdXRhdGUoZm9fc3ltYm9sID0gaWZlbHNlKGZvX3N5bWJvbD09Ik5VTEwiLE5BLGFzLmNoYXJhY3Rlcihmb19zeW1ib2wpKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxPU19OQVpXSVNLTyxPU19JTUlFLE9TX09TT0JBX0lELGZvX3N5bWJvbCxmb19uYXp3YSxmdW5rY2phKQ0KDQojdHV0YWogcHJ6ZXN6dWthxIcgWDI0NSBpIHpuYWxlxbrEhyBixYLEmWR5IHdzcMOzxYJ0d8OzcmPDs3cNCm1hcmNfZmllbGRfMjQ1IDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1KSU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJ+IiksDQogICAgICAgICBYMjQ1PXN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNDUiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI0NSE9IiIpICU+JQ0KICBtdXRhdGUoWDI0NT1zdHJfcmVtb3ZlX2FsbChYMjQ1LCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNDUsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjQ1LCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjQ1KVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI0NTwtY2JpbmQobWFyY19maWVsZF8yNDUsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNDUkWDI0NSA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI0NSRYMjQ1LHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI0NVssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI0NSRYMjQ1KSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNDUkWDI0NSksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF8yNDUgPC0gbWFyY19maWVsZF8yNDUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1Yz1gJGNgKQ0KDQpCTl93c3BvbHR3b3JjYSA8LSBCTl93c3BvbHR3b3JjYSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8yNDUsYnk9IlpBX1VXQUdJIikNCg0KeCA8LSAxOmxlbmd0aHMoQk5fd3Nwb2x0d29yY2FbMV0pDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBCTl93c3BvbHR3b3JjYSRjenlfbmF6d2lza29baV0gPC0gc3RyX2RldGVjdChCTl93c3BvbHR3b3JjYSRYMjQ1Y1tpXSxCTl93c3BvbHR3b3JjYSRPU19OQVpXSVNLT1tpXSkNCiAgQk5fd3Nwb2x0d29yY2EkY3p5X2ltaWVbaV0gPC0gZ3JlcGwoQk5fd3Nwb2x0d29yY2EkT1NfSU1JRVtpXSxCTl93c3BvbHR3b3JjYSRYMjQ1Y1tpXSkNCn0NCg0KQk5fd3Nwb2x0d29yY2EgPC0gQk5fd3Nwb2x0d29yY2EgJT4lDQogIG11dGF0ZShaQV9BRE5PVEFDSkUgPSBpZmVsc2UoY3p5X25hendpc2tvPT1GQUxTRXxjenlfaW1pZT09RkFMU0UscGFzdGUoIlVXQUdBISBLb25mbGlrdCB3IGRhbnljaCBvc29ib3d5Y2ggdyBwb2xhY2ggNzAwIGkgMjQ1LiBQb3LDs3duYWogcG9sYSB3c3DDs8WCdMOzcmPDs3cgdyBmb3JtdWxhcnp1IHogcG9sZW0gQk46ICIsWDI0NWMsc2VwID0gIiIpLE5BKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxPU19OQVpXSVNLTyxPU19JTUlFLE9TX09TT0JBX0lELGZvX3N5bWJvbCxmb19uYXp3YSxmdW5rY2phLFpBX0FETk9UQUNKRSkNCg0KIzc6IG9waXMgd3Nww7PFgnR3w7NyY8Ozdw0Kb3Bpc193c3BvbHR3b3Jjb3cgPC0gQk5fd3Nwb2x0d29yY2EgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxmdW5rY2phLE9TX0lNSUUsT1NfTkFaV0lTS08pICU+JQ0KICBmdWxsX2pvaW4oLixtYXJjX2ZpZWxkXzI0NSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShPU19OQVpXSVNLTyl8KGlzLm5hKE9TX05BWldJU0tPKSZncmVwbCgiZXQgYWxcXC4iLFgyNDVjKSkpICU+JQ0KICBtdXRhdGUoamVzdF9ldF9hbCA9IGdyZXBsKCJldCBhbFxcLiIsWDI0NWMpLA0KICAgICAgICAgT1NfSU1JRSA9IGlmZWxzZShPU19JTUlFPT0iKiIsIiIsYXMuY2hhcmFjdGVyKE9TX0lNSUUpKSwNCiAgICAgICAgIG9waXMgPSBpZmVsc2UoIWlzLm5hKE9TX05BWldJU0tPKSxwYXN0ZShmdW5rY2phLE9TX0lNSUUsIE9TX05BWldJU0tPLCBzZXAgPSAiICIpLCIiKSwNCiAgICAgICAgIG9waXMgPSBzdHJfcmVwbGFjZV9hbGwob3BpcywiICsiLCIgIiksDQogICAgICAgICBvcGlzID0gaWZlbHNlKG9waXM9PSIgIiwiIixhcy5jaGFyYWN0ZXIob3BpcykpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9waXMsamVzdF9ldF9hbCkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKG9waXMgPSBwYXN0ZShvcGlzLGNvbGxhcHNlID0gIiwgIiksDQogICAgICAgICBqZXN0X2V0X2FsID0gcGFzdGUodW5pcXVlKGplc3RfZXRfYWwpLHNlcCA9ICIiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShvcGlzID0gaWZlbHNlKGplc3RfZXRfYWw9PVRSVUUmb3Bpcz09IiIsImV0IGFsLiIsDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShqZXN0X2V0X2FsLHBhc3RlKG9waXMsImV0IGFsLiIsc2VwID0gIiAiKSxvcGlzKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksb3BpcykNCg0KIzcwMA0KbWFyY19maWVsZF83MDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg3MDApJT4lDQogIGZpbHRlcihYNzAwIT0iIikgJT4lDQogIG11dGF0ZShYNzAwPXN0cl9yZXBsYWNlX2FsbChYNzAwLCIoLi5cXCRhKSIsInxcXDEiKSwNCiAgICAgICAgIFg3MDA9c3RyX3JlcGxhY2VfYWxsKFg3MDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDcwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNzAwIT0iIikgJT4lDQogIG11dGF0ZShYNzAwPXN0cl9yZW1vdmVfYWxsKFg3MDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDcwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKSAlPiUNCiAgZmlsdGVyKFg3MDAhPSIiKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg3MDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF83MDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNzAwPC1jYmluZChtYXJjX2ZpZWxkXzcwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzcwMCRYNzAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNzAwJFg3MDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNzAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNzAwJFg3MDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzcwMCRYNzAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzcwMCA8LSBtYXJjX2ZpZWxkXzcwMCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9zb2JhID0gYCRhYCxmdW5rY2phID0gYCRlYCkgJT4lDQogIGZpbHRlcighaXMubmEoZnVua2NqYSkpICU+JQ0KICBtdXRhdGUob3NvYmEgPSBzdHJfcmVtb3ZlKG9zb2JhLCIoPzw9W2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKShcXC4kKSIpLA0KICAgICAgICAgT1NfTkFaV0lTS08gPSBpZmVsc2UoZ3JlcGwoIiwiLG9zb2JhKSxzdHJfcmVwbGFjZV9hbGwob3NvYmEsIiguKj8pKCwgKSguKikiLCJcXDEiKSxhcy5jaGFyYWN0ZXIob3NvYmEpKSwNCiAgICAgICAgIE9TX0lNSUUgPSBpZmVsc2UoZ3JlcGwoIiwiLG9zb2JhKSxzdHJfcmVwbGFjZV9hbGwob3NvYmEsIiguKj8pKCwgKSguKikiLCJcXDMiKSwiKiIpLA0KICAgICAgICAgZnVua2NqYV9kdXphID0gc3RyX3RvX2xvd2VyKGZ1bmtjamEpLA0KICAgICAgICAgb3BpcyA9IHBhc3RlKGZ1bmtjamFfZHV6YSxPU19JTUlFLE9TX05BWldJU0tPLCBzZXAgPSAiICIpLA0KICAgICAgICAgb3Bpc19kdXp5ID0gcGFzdGUoZnVua2NqYSxPU19JTUlFLE9TX05BWldJU0tPLCBzZXAgPSAiICIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9waXMsb3Bpc19kdXp5KSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUob3BpcyA9IHBhc3RlKG9waXMsY29sbGFwc2UgPSAiLiAiKSwNCiAgICAgICAgIG9waXNfZHV6eSA9IHBhc3RlKG9waXNfZHV6eSxjb2xsYXBzZSA9ICIuICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKQ0KDQojb3BpcyB3c3DDs8WCdHfDs3Jjw7N3IHplIHN0cmVmeSBvZHBvd2llZHppYWxub8WbY2kgMjQ1DQptYXJjX2ZpZWxkXzI0NSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NSklPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwifiIpLA0KICAgICAgICAgWDI0NT1zdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMjQ1IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDI0NSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI0NSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNDU8LWNiaW5kKG1hcmNfZmllbGRfMjQ1LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjQ1JFgyNDUgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNDUkWDI0NSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8yNDVbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8yNDUkWDI0NSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMjQ1JFgyNDUpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfMjQ1IDwtIG1hcmNfZmllbGRfMjQ1ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRjYCkNCg0KI3BvcsOzd25hbmllIG9waXN1IHdzcMOzxYJ0d8OzcmPDs3cgeiAyNDUgaSA3MDANCndzcG9sdHdvcmN5IDwtIG1hcmNfZmllbGRfNzAwICU+JQ0KICBmdWxsX2pvaW4oLixtYXJjX2ZpZWxkXzI0NSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgY1NwbGl0KC4sIiRjIixzZXAgPSAiIDsgIixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICAjb2dyYW5pY3phbmllIG9zw7NiIHplIHN0cmVmeSBvZHBvd2llZHppYWxub8WbY2kNCiAgbXV0YXRlKGN6eV9tYWxhID0gZ3JlcGwoIiBbYS16xJnDs8SFxZvFgsW8xbrEh8WEXXxeW2EtesSZw7PEhcWbxYLFvMW6xIfFhF18XFxbW2EtesSZw7PEhcWbxYLFvMW6xIfFhF0iLGAkY2AsaWdub3JlLmNhc2UgPSBGQUxTRSkpICU+JQ0KICBmaWx0ZXIoY3p5X21hbGE9PVRSVUUpICU+JQ0KICBzZWxlY3QoLWN6eV9tYWxhKSAlPiUNCiAgI211dGF0ZShgJGNgID0gZ3N1YigiXihcXFspezAsMX0oW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKSIsIlxcMVxcVVxcMiIscGVybCA9IFRSVUUsYCRjYCkpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShYMjQ1ID0gcGFzdGUoYCRjYCwgY29sbGFwc2UgPSAiLCAiKSkgJT4lDQogIHNlbGVjdCgtYCRjYCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUob3JkZXJfcGJsID0gYXMuY2hhcmFjdGVyKHN0cl9leHRyYWN0X2FsbChvcGlzLCIoPzw9XnwgfFxcW3wtKShbQS1aQcOBw4DDgsODw4TEgsSAw4XEhMOGRcOJw4jDisOLxJrEksSWxJhJw43DjMOOw4/EqsSuSU/Dk8OSw5TDlcOWxZDDmMWSVcOaw5nDm8OcxbDFqsWvWcOdQ8SGxIzDp0TEjsSQxJBHxKLEnkvEtkzFgcS7TsWDw5HFh8WFxYpSxZhTxZrFoMWeU8OfVMWkxabDnsWiOFrFu8W5xb1hLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSkiKSksDQogICAgICAgICBvcmRlcl9wYmwgPSBzdHJfcmVwbGFjZV9hbGwob3JkZXJfcGJsLCIoLio/XCIpKC4pKFwiLio/LikiLCAiXFwyIiksDQogICAgICAgICBvcmRlcl9ibiA9IGFzLmNoYXJhY3RlcihzdHJfZXh0cmFjdF9hbGwoWDI0NSwiKD88PV58IHxcXFt8LSkoW0EtWkHDgcOAw4LDg8OExILEgMOFxITDhkXDicOIw4rDi8SaxJLElsSYScONw4zDjsOPxKrErklPw5PDksOUw5XDlsWQw5jFklXDmsOZw5vDnMWwxarFr1nDnUPEhsSMw6dExI7EkMSQR8SixJ5LxLZMxYHEu07Fg8ORxYfFhcWKUsWYU8WaxaDFnlPDn1TFpMWmw57FojhaxbvFucW9YS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0pIikpLA0KICAgICAgICAgb3JkZXJfYm4gPSBzdHJfcmVwbGFjZV9hbGwob3JkZXJfYm4sIiguKj9cIikoLikoXCIuKj8uKSIsICJcXDIiKSwNCiAgICAgICAgIFgyNDUgPSBzdHJfcmVtb3ZlKFgyNDUsICJcXC4kIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCAiXFxbIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCAiXFxdIiksDQogICAgICAgICBvcmRlcl9wYmwgPSBzdHJfcmVtb3ZlX2FsbChvcmRlcl9wYmwsICJbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0iKSwNCiAgICAgICAgIG9yZGVyX2JuID0gc3RyX3JlbW92ZV9hbGwob3JkZXJfYm4sICJbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl0iKSwNCiAgICAgICAgIHRvX3NhbW8gPSBvcmRlcl9wYmw9PW9yZGVyX2JuLA0KICAgICAgICAgWDI0NSA9IGdzdWIoIiheW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKSguKikiLCJcXFVcXDFcXEVcXDIiLHBlcmwgPSBUUlVFLCBYMjQ1KSkgJT4lDQogIGxlZnRfam9pbiguLHphX2plenlrX29yeWdpbmFsdSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKGN6eV9wbCA9IGdyZXBsKCJwb2wiLFpBX0pFWllLX09SWUdJTkFMVSl8aXMubmEoWkFfSkVaWUtfT1JZR0lOQUxVKSwNCiAgICAgICAgIGRlY3l6amEgPSBpZmVsc2UodG9fc2Ftbz09RkFMU0V8Y3p5X3BsPT1GQUxTRSxGQUxTRSxUUlVFKSkNCg0KemFfb3Bpc193c3BvbHR3b3Jjb3cgPC0gd3Nwb2x0d29yY3kgJT4lDQogIG11dGF0ZSh6YV9vcGlzX3dzcG9sdHdvcmNvdyA9IGlmZWxzZShkZWN5emphPT1UUlVFLGFzLmNoYXJhY3RlcihYMjQ1KSxwYXN0ZShYMjQ1LG9waXNfZHV6eSxzZXAgPSAiIyIpKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxvcGlzX2R1enksemFfb3Bpc193c3BvbHR3b3Jjb3cpICU+JQ0KICBjU3BsaXQoLiwiemFfb3Bpc193c3BvbHR3b3Jjb3ciLHNlcCA9ICIjIixkaXJlY3Rpb24gPSAid2lkZSIpICU+JQ0KICBtdXRhdGUoemFfb3Bpc193c3BvbHR3b3Jjb3dfMiA9IGlmZWxzZShpcy5uYSh6YV9vcGlzX3dzcG9sdHdvcmNvd18yKSwnJyxhcy5jaGFyYWN0ZXIoemFfb3Bpc193c3BvbHR3b3Jjb3dfMikpLA0KICAgICAgICAgdG9fc2FtbyA9IHphX29waXNfd3Nwb2x0d29yY293XzE9PXphX29waXNfd3Nwb2x0d29yY293XzIpICU+JQ0KICBmaWx0ZXIodG9fc2Ftbz09RkFMU0UpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZSh6YV9vcGlzX3dzcG9sdHdvcmNvdyA9IHBhc3RlKHphX29waXNfd3Nwb2x0d29yY293XzEsemFfb3Bpc193c3BvbHR3b3Jjb3dfMixzZXAgPSAiIyIpLA0KICAgICAgICAgemFfb3Bpc193c3BvbHR3b3Jjb3cgPSBzdHJfcmVtb3ZlX2FsbCh6YV9vcGlzX3dzcG9sdHdvcmNvdywiXFwjJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLHphX29waXNfd3Nwb2x0d29yY293KQ0KDQpvcGlzX3dzcG9sdHdvcmNvdyA8LSBvcGlzX3dzcG9sdHdvcmNvdyAlPiUNCiAgZmlsdGVyKFpBX1VXQUdJICVub3RpbiUgemFfb3Bpc193c3BvbHR3b3Jjb3ckWkFfVVdBR0kpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKG9waXMpKSAlPiUNCiAgcmVuYW1lKHphX29waXNfd3Nwb2x0d29yY293ID0gb3BpcykNCg0KemFfb3Bpc193c3BvbHR3b3Jjb3cgPC0gemFfb3Bpc193c3BvbHR3b3Jjb3cgJT4lDQogIGJpbmRfcm93cyguLG9waXNfd3Nwb2x0d29yY293KSAlPiUNCiAgcmlnaHRfam9pbiguLGRhdGEgJT4lIHNlbGVjdChaQV9VV0FHSSksYnk9IlpBX1VXQUdJIikNCg0KIzggd3lkYW5pZQ0KbWFyY19maWVsZF8yNTAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNTApJT4lDQogIGZpbHRlcihYMjUwIT0iIikgJT4lDQogIG11dGF0ZShYMjUwPXN0cl9yZXBsYWNlX2FsbChYMjUwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgyNTAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDI1MCE9IiIpICU+JQ0KICBtdXRhdGUoWDI1MD1zdHJfcmVtb3ZlX2FsbChYMjUwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgyNTAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMjUwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMjUwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzI1MDwtY2JpbmQobWFyY19maWVsZF8yNTAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8yNTAkWDI1MCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzI1MCRYMjUwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI1MFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI1MCRYMjUwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNTAkWDI1MCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQp6YV93eWRhbmllIDwtIG1hcmNfZmllbGRfMjUwICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIHd5ZGFuaWUgPSBgJGFgKSAlPiUNCiAgbXV0YXRlKHd5ZGFuaWUgPSBzdHJfcmVtb3ZlKHd5ZGFuaWUsIiBcXC8kIikpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojOTogaW5zdHl0dWNqYSBzcHJhd2N6YQ0KbWFyY19maWVsZF8yNDUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIn4iKSwNCiAgICAgICAgIFgyNDU9c3RyX3JlcGxhY2VfYWxsKFgyNDUsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDI0NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8yNDUpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMjQ1PC1jYmluZChtYXJjX2ZpZWxkXzI0NSxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzI0NSRYMjQ1IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMjQ1JFgyNDUsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMjQ1WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMjQ1JFgyNDUpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzI0NSRYMjQ1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCnphX2luc3R5dHVjamEgPC0gbWFyY19maWVsZF8yNDUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1Yz1gJGNgKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShYMjQ1YykpICU+JQ0KICBtdXRhdGUoaW5zdHl0dWNqYSA9IGlmZWxzZShncmVwbCgiXFw7IixYMjQ1Yyksc3RyX3JlcGxhY2VfYWxsKFgyNDVjLCAiKC4qPykoXFw7KD8hLipcXDspKSggKSsoLio/JCkiLCJcXDQiKSwiIikpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93c3BvbHR3b3JjYSxieT0iWkFfVVdBR0kiKQ0KDQp4IDwtIDE6bGVuZ3Rocyh6YV9pbnN0eXR1Y2phWzFdKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgemFfaW5zdHl0dWNqYSRjenlfbmF6d2lza29baV0gPC0gZ3JlcGwoemFfaW5zdHl0dWNqYSRPU19OQVpXSVNLT1tpXSx6YV9pbnN0eXR1Y2phJFgyNDVjW2ldKQ0KICB6YV9pbnN0eXR1Y2phJGN6eV9pbWllW2ldIDwtIGdyZXBsKHphX2luc3R5dHVjamEkT1NfSU1JRVtpXSx6YV9pbnN0eXR1Y2phJFgyNDVjW2ldKQ0KfQ0KDQp6YV9pbnN0eXR1Y2phIDwtIHphX2luc3R5dHVjamEgJT4lDQogIGZpbHRlcihpcy5uYShjenlfbmF6d2lza28pJmlzLm5hKGN6eV9pbWllKSkgJT4lDQogIGZpbHRlcihpbnN0eXR1Y2phIT0iIikgJT4lDQogIGZpbHRlcighZ3JlcGwoIl5cXFtbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl18XlthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSIsaW5zdHl0dWNqYSkpICU+JQ0KICBtdXRhdGUoaW5zdHl0dWNqYSA9IHN0cl9yZW1vdmUoaW5zdHl0dWNqYSwiXFwuJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGluc3R5dHVjamEpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojMTA6IHd5ZGF3bmljdHdvDQpCTl93eWRhd25pY3R3byA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIFgyNjApICU+JQ0KICBtdXRhdGUoWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJzXFwublxcLiIsICJiLncuIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJzXFwubFxcLiIsICJiLm0uIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJTXFwubFxcLiIsICJiLm0uIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZW1vdmUoWDI2MCwiXlxcXFwrIiksIA0KICAgICAgICAgcm9rX3d5ZGFuaWEgPSBzdHJfZXh0cmFjdF9hbGwoWDI2MCwgIig/PD1cXCRjKS4qKD89XFwkZSl8KD88PVxcJGMpLioiKSwgDQogICAgICAgICBiZXpfcm9rdSA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCAiLlxcJGMuKiIsICIiKSwgDQogICAgICAgICBpbGVfd3lkYXduaWN0dyA9IHN0cl9jb3VudChiZXpfcm9rdSwgIlxcJGIiKSwNCiAgICAgICAgIGlsZV9taWVqc2MgPSBzdHJfY291bnQoYmV6X3Jva3UsICJcXCRhIiksDQogICAgICAgICBrb2xlam5vc2MgPSBzdHJfcmVwbGFjZV9hbGwoYXMuY2hhcmFjdGVyKHN0cl9leHRyYWN0X2FsbChiZXpfcm9rdSwgIlxcJC4iKSksICJbXmEtel0iLCAiIiksDQogICAgICAgICBiZXpfcm9rdSA9IHN0cl9yZXBsYWNlX2FsbChiZXpfcm9rdSwgIjtcXCRiIiwgIjokYiIpLA0KICAgICAgICAgd3lkYXdfcG9kemllbCA9IGlmZWxzZShpbGVfd3lkYXduaWN0dz5pbGVfbWllanNjfGtvbGVqbm9zYz09ImNhYWJiIiwgc3RyX3JlcGxhY2VfYWxsKGJlel9yb2t1LCAiKFxcJGEpKC4qPykoIDpcXCRiLio/KSggOlxcJGIpIiwgIlxcMVxcMlxcMyA7JGFcXDJcXDQiKSxiZXpfcm9rdSksDQogICAgICAgICB3eWRhd25pY3R3b190ZXN0ID0gc3RyX3JlcGxhY2VfYWxsKHd5ZGF3X3BvZHppZWwsICIoXFwkYikoLio/KSggO1xcJGEpIiwgIlxcMVxcMnxcXDMiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxyb2tfd3lkYW5pYSx3eWRhd25pY3R3b190ZXN0KSAlPiUNCiAgY1NwbGl0KC4sICJ3eWRhd25pY3R3b190ZXN0Iiwgc2VwID0gInwiLCBkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBtdXRhdGUod3lkYXduaWN0d28gPSBzdHJfZXh0cmFjdF9hbGwod3lkYXduaWN0d29fdGVzdCwgIig/PD1cXCRiKSguKikiKSwNCiAgICAgICAgIG1pZWpzY2Vfd3lkYW5pYSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfZXh0cmFjdF9hbGwod3lkYXduaWN0d29fdGVzdCwgIig/PD1cXCRhKSguKikoPz0gezAsMX06IHswLDF9XFwkYil8KD88PVxcJGEpKC4qKSgkKSIpLCIgO1xcJGEiLCAiLCAiKSwNCiAgICAgICAgIG5hendhX3Byb3N0YSA9IHN0cl90b19sb3dlcihzdHJfcmVwbGFjZV9hbGwoc3RyX3JlcGxhY2VfYWxsKHVubGlzdCh3eWRhd25pY3R3b190ZXN0KSwgIlxcJFxcdyIsICIiKSwgIlxcVyIsICIiKSkpICU+JQ0KICBsZWZ0X2pvaW4oLixQQkxfd3lkYXduaWN0d2EsYnk9Im5hendhX3Byb3N0YSIpICU+JQ0KICBtdXRhdGUodG9fc2FtbyA9IHd5ZGF3bmljdHdvPT1XWV9OQVpXQSkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksLXRvX3NhbW8sLVdZX0xJQ1pCQV9aQVBJU09XKQ0KQk5fd3lkYXduaWN0d28kaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKEJOX3d5ZGF3bmljdHdvWzE6M10pKQ0KQk5fd3lkYXduaWN0d28gPC0gQk5fd3lkYXduaWN0d29bIWR1cGxpY2F0ZWQoQk5fd3lkYXduaWN0d28kaWRfZ3J1cHkpLF0gJT4lDQogIG11dGF0ZShXWV9OQVpXQSA9IGlmZWxzZSghaXMubmEoV1lfTkFaV0EpLGFzLmNoYXJhY3RlcihXWV9OQVpXQSksYXMuY2hhcmFjdGVyKHd5ZGF3bmljdHdvKSksDQogICAgICAgICBXWV9NSUFTVE8gPSBpZmVsc2UoIWlzLm5hKFdZX01JQVNUTyksYXMuY2hhcmFjdGVyKFdZX01JQVNUTyksdHJpbShhcy5jaGFyYWN0ZXIobWllanNjZV93eWRhbmlhKSkpLA0KICAgICAgICAgcm9rX3d5ZGFuaWEgPSBzdHJfcmVwbGFjZV9hbGwocm9rX3d5ZGFuaWEsICIoLiopKFxcLikiLCAiXFwxIiksDQogICAgICAgICB6YV9yb2tfd3lkYW5pYSA9IGlmZWxzZShuY2hhcihyb2tfd3lkYW5pYSk9PTQsYXMuY2hhcmFjdGVyKHJva193eWRhbmlhKSxOQSksDQogICAgICAgICBkb19vcGlzdSA9IGlmZWxzZShpcy5uYSh6YV9yb2tfd3lkYW5pYSkscGFzdGUoIlsiLHN0cl9leHRyYWN0KHJva193eWRhbmlhLCJcXGR7NH0iKSwiXSIsc2VwID0gIiIpLCIiKSwNCiAgICAgICAgIFdZX01JQVNUTyA9IGlmZWxzZShzdWJzdHIoV1lfTUlBU1RPLDEsMSk9PSJbIiZzdWJzdHIoV1lfTUlBU1RPLG5jaGFyKFdZX01JQVNUTyksbmNoYXIoV1lfTUlBU1RPKSkhPSJdIiZpcy5uYShXWV9XWURBV05JQ1RXT19JRCkscGFzdGUodHJpbShXWV9NSUFTVE8pLCJdIixzZXAgPSAiIiksYXMuY2hhcmFjdGVyKFdZX01JQVNUTykpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFdZX1dZREFXTklDVFdPX0lELFdZX05BWldBLFdZX01JQVNUTyx6YV9yb2tfd3lkYW5pYSxkb19vcGlzdSkgJT4lIA0KICBtdXRhdGUoV1lfTkFaV0EgPSBpZmVsc2Uoc3RyX2NvdW50KFdZX05BWldBLCAiXFxbIik+c3RyX2NvdW50KFdZX05BWldBLCAiXFxdIiksIHBhc3RlKFdZX05BWldBLCAiXSIsIHNlcCA9ICIiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfY291bnQoV1lfTkFaV0EsICJcXFsiKTxzdHJfY291bnQoV1lfTkFaV0EsICJcXF0iKSwgcGFzdGUoIlsiLCBXWV9OQVpXQSwgc2VwID0gIiIpLCBhcy5jaGFyYWN0ZXIoV1lfTkFaV0EpKSksDQogICAgICAgICBXWV9NSUFTVE8gPSBpZmVsc2Uoc3RyX2NvdW50KFdZX01JQVNUTywgIlxcWyIpPnN0cl9jb3VudChXWV9NSUFTVE8sICJcXF0iKSwgcGFzdGUoV1lfTUlBU1RPLCAiXSIsIHNlcCA9ICIiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfY291bnQoV1lfTUlBU1RPLCAiXFxbIik8c3RyX2NvdW50KFdZX01JQVNUTywgIlxcXSIpLCBwYXN0ZSgiWyIsIFdZX01JQVNUTywgc2VwID0gIiIpLCBhcy5jaGFyYWN0ZXIoV1lfTUlBU1RPKSkpKQ0KDQojMTE6IG9waXMgZml6eWN6bnkga3NpxIXFvGtpDQojcG9sZSAzMDAgZG8gb3Bpc3UgZml6eWN6bmVnbw0KbWFyY19maWVsZF8zMDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgzMDApJT4lDQogIGZpbHRlcihYMzAwIT0iIikgJT4lDQogIG11dGF0ZShYMzAwPXN0cl9yZXBsYWNlX2FsbChYMzAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgzMDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDMwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDMwMD1zdHJfcmVtb3ZlX2FsbChYMzAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgzMDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMzAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMzAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzMwMDwtY2JpbmQobWFyY19maWVsZF8zMDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8zMDAkWDMwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzMwMCRYMzAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzMwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzMwMCRYMzAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8zMDAkWDMwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF8zMDAgPC0gbWFyY19maWVsZF8zMDAgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlbW92ZShgJGFgLCIgXFw7KyR8IFxcOiskIiksDQogICAgICAgICBgJGJgID0gc3RyX3JlbW92ZShgJGJgLCIgXFw7KyR8IFxcOiskIiksDQogICAgICAgICBgJGVgID0gaWZlbHNlKGdyZXBsKCJDRC1ST018RFZEfFZDRHxDRCIsYCRlYCkmZ3JlcGwoIlxcKyBkeXNrfHDFgnl0IixgJGVgKSxzdHJfZXh0cmFjdChgJGVgLCIoPzw9XFwrKShkeXNrfHDFgnl0Lio/KShDRC1ST018RFZEfFZDRHxDRCkoXFwpKXswLDF9IiksDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiQ0QtUk9NfERWRHxWQ0R8Q0QiLGAkZWApLHN0cl9leHRyYWN0KGAkZWAsIiheLio/KShDRC1ST018RFZEfFZDRHxDRCkoXFwpKXswLDF9IiksTkEpKSwNCiAgICAgICAgIGAkYWAgPSBpZmVsc2UoaXMubmEoYCRhYCksIiIsYXMuY2hhcmFjdGVyKGAkYWApKSwNCiAgICAgICAgIGAkYmAgPSBpZmVsc2UoaXMubmEoYCRiYCksIiIsYXMuY2hhcmFjdGVyKGAkYmApKSwNCiAgICAgICAgIGAkZWAgPSBpZmVsc2UoaXMubmEoYCRlYCksIiIsYXMuY2hhcmFjdGVyKGAkZWApKSkNCiNwb2xlIDUwMCBkbyBvcGlzdSBmaXp5Y3puZWdvDQptYXJjX2ZpZWxkXzUwMCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDUwMCklPiUNCiAgZmlsdGVyKFg1MDAhPSIiKSAlPiUNCiAgbXV0YXRlKFg1MDA9c3RyX3JlcGxhY2VfYWxsKFg1MDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDUwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNTAwIT0iIikgJT4lDQogIG11dGF0ZShYNTAwPXN0cl9yZW1vdmVfYWxsKFg1MDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDUwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg1MDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF81MDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNTAwPC1jYmluZChtYXJjX2ZpZWxkXzUwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzUwMCRYNTAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNTAwJFg1MDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNTAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNTAwJFg1MDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzUwMCRYNTAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzUwMCA8LSBtYXJjX2ZpZWxkXzUwMCAlPiUNCiAgbXV0YXRlKGAkYWAgPSBpZmVsc2UoZ3JlcGwoIm9yeWcoXFwufFxcLCkiLFg1MDApJmdyZXBsKCJwc2V1ZHxuYXp3YSIsWDUwMCxpZ25vcmUuY2FzZSA9IFRSVUUpLHN0cl9yZXBsYWNlKGAkYWAsIiheLio/KShcXC4gKShcXHB7THV9LiokKSIsIlxcMyIpLGFzLmNoYXJhY3RlcihgJGFgKSkpICU+JSANCiAgZmlsdGVyKCFncmVwbCgib3J5ZyhcXC58XFwsKSIsYCRhYCkmZ3JlcGwoInBzZXVkfG5hendhfGRvdHljenxwb2wiLGAkYWAsaWdub3JlLmNhc2UgPSBUUlVFKSkgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlbW92ZShgJGFgLCIgXFw7KyR8IFxcOiskIikpDQoNCiNwb2xlIDU0NiBkbyBvcGlzdSBmaXp5Y3puZWdvDQptYXJjX2ZpZWxkXzU0NiA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDU0NiklPiUNCiAgZmlsdGVyKFg1NDYhPSIiKSAlPiUNCiAgbXV0YXRlKFg1NDY9c3RyX3JlcGxhY2VfYWxsKFg1NDYsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDU0NiIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNTQ2IT0iIikgJT4lDQogIG11dGF0ZShYNTQ2PXN0cl9yZW1vdmVfYWxsKFg1NDYsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDU0NiwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg1NDYsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF81NDYpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNTQ2PC1jYmluZChtYXJjX2ZpZWxkXzU0NixlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzU0NiRYNTQ2IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNTQ2JFg1NDYsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNTQ2WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNTQ2JFg1NDYpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzU0NiRYNTQ2KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzU0NiA8LSBtYXJjX2ZpZWxkXzU0NiAlPiUNCiAgbXV0YXRlKGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIiBcXDsrJHwgXFw6KyQiKSkNCg0KI3BvbGUgNTAxIGRvIG9waXN1IGZpenljem5lZ28NCm1hcmNfZmllbGRfNTAxIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNTAxKSU+JQ0KICBmaWx0ZXIoWDUwMSE9IiIpICU+JQ0KICBtdXRhdGUoWDUwMT1zdHJfcmVwbGFjZV9hbGwoWDUwMSwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNTAxIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg1MDEhPSIiKSAlPiUNCiAgbXV0YXRlKFg1MDE9c3RyX3JlbW92ZV9hbGwoWDUwMSwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNTAxLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDUwMSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzUwMSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF81MDE8LWNiaW5kKG1hcmNfZmllbGRfNTAxLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNTAxJFg1MDEgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF81MDEkWDUwMSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF81MDFbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF81MDEkWDUwMSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNTAxJFg1MDEpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCm1hcmNfZmllbGRfNTAxIDwtIG1hcmNfZmllbGRfNTAxICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIGAkYWApDQoNCnphX29waXNfa3MgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3lkYXduaWN0d28gJT4lIHNlbGVjdChaQV9VV0FHSSxkb19vcGlzdSksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfMzAwICU+JSBzZWxlY3QoWkFfVVdBR0ksWDMwMGE9YCRhYCxYMzAwYj1gJGJgLFgzMDBlPWAkZWApLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzUwMCAlPiUgc2VsZWN0KFpBX1VXQUdJLFg1MDBhPWAkYWApLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzU0NiAlPiUgc2VsZWN0KFpBX1VXQUdJLFg1NDZhPWAkYWApLGJ5PSJaQV9VV0FHSSIpICU+JSANCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF81MDEgJT4lIHNlbGVjdChaQV9VV0FHSSxYNTAxYT1gJGFgKSxieT0iWkFfVVdBR0kiKQ0KemFfb3Bpc19rc1tpcy5uYSh6YV9vcGlzX2tzKV0gIDwtICIiDQp6YV9vcGlzX2tzIDwtIHphX29waXNfa3MgJT4lDQogIG11dGF0ZSh6YV9vcGlzX2tzID0gcGFzdGUoaWZlbHNlKGRvX29waXN1IT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoZG9fb3Bpc3UpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDMwMGEhPSIiLHBhc3RlKGFzLmNoYXJhY3RlcihYMzAwYSksIiwgIixzZXAgPSAiIiksIiIpLGlmZWxzZShYMzAwYiE9IiIscGFzdGUoYXMuY2hhcmFjdGVyKFgzMDBiKSwiLCAiLHNlcCA9ICIiKSwiIiksaWZlbHNlKFgzMDBlIT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoWDMwMGUpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDUwMGEhPSIiLHBhc3RlKGFzLmNoYXJhY3RlcihYNTAwYSksIiwgIixzZXAgPSAiIiksIiIpLGlmZWxzZShYNTQ2YSE9IiIsYXMuY2hhcmFjdGVyKFg1NDZhKSwiIiksaWZlbHNlKFg1MDFhIT0iIixhcy5jaGFyYWN0ZXIoWDUwMWEpLCIiKSxzZXAgPSAiIiksDQogICAgICAgICB6YV9vcGlzX2tzID0gc3RyX3JlbW92ZSh6YV9vcGlzX2tzLCIoLCApKyQiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSx6YV9vcGlzX2tzKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksLW5jaGFyKHphX29waXNfa3MpKQ0KemFfb3Bpc19rcyRpZF9ncnVweSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQoemFfb3Bpc19rc1sxXSkpDQp6YV9vcGlzX2tzIDwtIHphX29waXNfa3NbIWR1cGxpY2F0ZWQoemFfb3Bpc19rcyRpZF9ncnVweSksXSAlPiUNCiAgc2VsZWN0KC1pZF9ncnVweSkNCg0KIzEyOiBzZXJpYSB3eWRhd25pY3phDQptYXJjX2ZpZWxkXzQ5MCA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDQ5MCxYODAwLFg4MzApICU+JQ0KICBtdXRhdGUoWDQ5MCA9IGlmZWxzZShncmVwbCgiVVxcKyIsWDQ5MCksYXMuY2hhcmFjdGVyKFg4MzApLGFzLmNoYXJhY3RlcihYNDkwKSkpICU+JQ0KICBtdXRhdGUoWDgwMCA9IGlmZWxzZShYNDkwIT0iIiwiIixhcy5jaGFyYWN0ZXIoWDgwMCkpLA0KICAgICAgICAgWDgzMCA9IGlmZWxzZShYNDkwIT0iIiwiIixhcy5jaGFyYWN0ZXIoWDgzMCkpLA0KICAgICAgICAgWDgwMCA9IHN0cl9yZXBsYWNlKFg4MDAsIihcXCRhKSguKikoXFwkdCkiLCJcXDEiKSwNCiAgICAgICAgIFg0OTAgPSBpZmVsc2UoWDQ5MD09IiImWDgzMCE9IiIsYXMuY2hhcmFjdGVyKFg4MzApLA0KICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoWDQ5MD09IiImWDgwMCE9IiIsYXMuY2hhcmFjdGVyKFg4MDApLGFzLmNoYXJhY3RlcihYNDkwKSkpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg0OTApICU+JQ0KICBmaWx0ZXIoWDQ5MCE9IiIpICU+JQ0KICBtdXRhdGUoWDQ5MD1zdHJfcmVwbGFjZV9hbGwoWDQ5MCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYNDkwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFg0OTAhPSIiKSAlPiUNCiAgbXV0YXRlKFg0OTA9c3RyX3JlbW92ZV9hbGwoWDQ5MCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYNDkwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDQ5MCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzQ5MClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF80OTA8LWNiaW5kKG1hcmNfZmllbGRfNDkwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfNDkwJFg0OTAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF80OTAkWDQ5MCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF80OTBbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF80OTAkWDQ5MCksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfNDkwJFg0OTApLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCnphX3NlcmlhX3d5ZGF3bmljemEgPC0gbWFyY19maWVsZF80OTAgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlcGxhY2VfYWxsKGAkYWAsIig9KShcXCRhKSIsIlxcMSAiKSwNCiAgICAgICAgIGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIiBcXDsrJHwgXFw6KyQiKSwNCiAgICAgICAgIGAkdmAgPSBpZmVsc2UoaXMubmEoYCR2YCksIiIsYXMuY2hhcmFjdGVyKGAkdmApKSkgJT4lDQogIGZpbHRlcighaXMubmEoYCRhYCkpICU+JQ0KICBtdXRhdGUoc2VyaWEgPSBzdHJfcmVtb3ZlKHBhc3RlKCIoIixgJGFgLCI7ICIsYCR2YCwiKSIsc2VwID0gIiIpLCI7ICg/PVxcKSQpIiksDQogICAgICAgICBzZXJpYSA9IGdzdWIoIiggOiApKC4pIiwiLiBcXFVcXDIiLHBlcmw9VFJVRSxzZXJpYSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksc2VyaWEpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShzZXJpYSA9IHBhc3RlKHNlcmlhLGNvbGxhcHNlID0gIiAiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIG11dGF0ZShzZXJpYSA9IHN0cl9yZXBsYWNlX2FsbChzZXJpYSwiXFwkLiIsIjsgIikpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojMTM6IHRvbXkNCnphX3RvbXkgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKHphX3RvbXkgPSBOQSkNCg0KIzE0OiBhZG5vdGFjamUNCnphX2Fkbm90YWNqZSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixaQV9BRE5PVEFDSkUgJT4lIHNlbGVjdChaQV9VV0FHSSxaQV9BRE5PVEFDSkUpLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93c3BvbHR3b3JjYSAlPiUgc2VsZWN0KFpBX1VXQUdJLFpBX0FETk9UQUNKRSksYnk9IlpBX1VXQUdJIikgJT4lDQogIG11dGF0ZShaQV9BRE5PVEFDSkUgPSBwYXN0ZShpZmVsc2UoaXMubmEoWkFfQUROT1RBQ0pFLngpLCIiLHBhc3RlKGFzLmNoYXJhY3RlcihaQV9BRE5PVEFDSkUueCksIiMgIixzZXAgPSAiIikpLGlmZWxzZShpcy5uYShaQV9BRE5PVEFDSkUueSksIiIsYXMuY2hhcmFjdGVyKFpBX0FETk9UQUNKRS55KSksc2VwID0gIiIpLA0KICAgICAgICAgWkFfQUROT1RBQ0pFID0gc3RyX3JlbW92ZShaQV9BRE5PVEFDSkUsIigjICkrJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFpBX0FETk9UQUNKRSkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBhcnJhbmdlKFpBX1VXQUdJLC1uY2hhcihaQV9BRE5PVEFDSkUpKQ0KemFfYWRub3RhY2plJGlkX2dydXB5IDwtIGN1bXN1bSghZHVwbGljYXRlZCh6YV9hZG5vdGFjamVbMV0pKQ0KemFfYWRub3RhY2plIDwtIHphX2Fkbm90YWNqZVshZHVwbGljYXRlZCh6YV9hZG5vdGFjamUkaWRfZ3J1cHkpLF0gJT4lDQogIHNlbGVjdCgtaWRfZ3J1cHkpDQoNCiMxNTogQk5fVVJMDQpCTl9VUkwgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLEJOX1VSTCkNCg0KI3d5csOzd25hbmllIGxpY3pieSB3aWVyc3p5IGRvIGxpY3pieSB3aWVyc3p5IG9iaWVrdHUgZGF0YQ0KQk5fd3Nwb2x0d29yY2EgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3Nwb2x0d29yY2EgJT4lIHNlbGVjdChaQV9VV0FHSSxPU19PU09CQV9JRCxPU19OQVpXSVNLTyxPU19JTUlFLGZvX3N5bWJvbCksYnk9IlpBX1VXQUdJIikgJT4lDQogIGRkcGx5KC4sIC4oWkFfVVdBR0kpLCBzdW1tYXJpemUsIE9TX09TT0JBX0lEID0gcGFzdGUoT1NfT1NPQkFfSUQsIGNvbGxhcHNlPSJ8IiksIE9TX05BWldJU0tPID0gcGFzdGUoT1NfTkFaV0lTS08sIGNvbGxhcHNlPSJ8IiksIE9TX0lNSUUgPSBwYXN0ZShPU19JTUlFLCBjb2xsYXBzZT0ifCIpLCBmb19zeW1ib2wgPSBwYXN0ZShmb19zeW1ib2wsIGNvbGxhcHNlPSJ8IikpICU+JQ0KICBtdXRhdGUoZm9fc3ltYm9sID0gaWZlbHNlKGZvX3N5bWJvbD09Ik5VTEwiLCJOQSIsYXMuY2hhcmFjdGVyKGZvX3N5bWJvbCkpKQ0KQk5fd3lkYXduaWN0d28gPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3lkYXduaWN0d28gJT4lIHNlbGVjdChaQV9VV0FHSSxXWV9XWURBV05JQ1RXT19JRCxXWV9OQVpXQSxXWV9NSUFTVE8semFfcm9rX3d5ZGFuaWEpLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBkZHBseSguLCAuKFpBX1VXQUdJKSwgc3VtbWFyaXplLCBXWV9XWURBV05JQ1RXT19JRCA9IHBhc3RlKFdZX1dZREFXTklDVFdPX0lELCBjb2xsYXBzZT0ifCIpLCBXWV9OQVpXQSA9IHBhc3RlKFdZX05BWldBLCBjb2xsYXBzZT0ifCIpLCBXWV9NSUFTVE8gPSBwYXN0ZShXWV9NSUFTVE8sIGNvbGxhcHNlPSJ8IiksIHphX3Jva193eWRhbmlhID0gcGFzdGUodW5pcXVlKHphX3Jva193eWRhbmlhKSwgY29sbGFwc2U9InwiKSkgJT4lDQogIG11dGF0ZSh6YV9yb2tfd3lkYW5pYSA9IGlmZWxzZSh6YV9yb2tfd3lkYW5pYT09Ik5BIiwiIixhcy5pbnRlZ2VyKHphX3Jva193eWRhbmlhKSkpDQoNCiNwb8WCxIVjemVuaWUgd3N6eXN0a2ljaCBlbGVtZW50w7N3IHcgamVkbsSFIHRhYmVsxJkNCmtvbGVqbm9zYyA8LSBkYXRhLmZyYW1lKGtvbGVqbm9zYz1jKCJaQV9VV0FHSSIsIlJaX05BWldBIiwiWkFfUk9fUk9LIiwiWkFfVFlQRSIsIlJaX1JPRFpBSl9JRCIsIkRaX05BWldBIiwiRFpfRFpJQUxfSUQiLCJUV19UV09SQ0FfSUQiLCJBTV9BVVRPUl9JRCIsIkFNX05BWldJU0tPIiwiQU1fSU1JRSIsIlpBX1RZVFVMIiwiWkFfVFlUVUxfT1JZR0lOQUxVIiwiWkFfSkVaWUtfT1JZR0lOQUxVIiwiT1NfT1NPQkFfSUQiLCJPU19OQVpXSVNLTyIsIk9TX0lNSUUiLCJmb19zeW1ib2wiLCJ6YV9vcGlzX3dzcG9sdHdvcmNvdyIsInd5ZGFuaWUiLCJ6YV90b215IiwiaW5zdHl0dWNqYSIsIldZX1dZREFXTklDVFdPX0lEIiwiV1lfTUlBU1RPIiwiV1lfTkFaV0EiLCJ6YV9yb2tfd3lkYW5pYSIsInphX29waXNfa3MiLCJzZXJpYSIsIlRXX05BWldJU0tPIiwiVFdfSU1JRSIsInJlZGFrdG9yX2R6aWFsdSIsIlpBX0FETk9UQUNKRSIsIkJOX1VSTCIpKQ0KcG9sYWN6b25lIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLHBvbGFfcGJsLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLEJOX2F1dG9yLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX3R5dHVsLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX3R5dHVsX29yeWdpbmFsdSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9qZXp5a19vcnlnaW5hbHUsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3Nwb2x0d29yY2EsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfb3Bpc193c3BvbHR3b3Jjb3csYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfd3lkYW5pZSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9pbnN0eXR1Y2phLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLEJOX3d5ZGF3bmljdHdvLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX29waXNfa3MsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfc2VyaWFfd3lkYXduaWN6YSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV90b215LGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX2Fkbm90YWNqZSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl9VUkwsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgc2VsZWN0KGFzLnZlY3Rvcihrb2xlam5vc2Mka29sZWpub3NjKSkNCmNvbG5hbWVzKHBvbGFjem9uZSkgPC0gYygicmVrb3JkX0JOIiwicnpfbmF6d2EiLCJ6YV9yb19yb2siLCJ6YV90eXBlIiwicnpfcm9kemFqX2lkIiwiRFpfTkFaV0EiLCJEWl9EWklBTF9JRCIsInR3X3R3b3JjYV9pZCIsImFtX2F1dG9yX2lkIiwiYW1fbmF6d2lza28iLCJhbV9pbWllIiwiemFfdHl0dWwiLCJ6YV90eXR1bF9vcnlnaW5hbHUiLCJ6YV9qZXp5a19vcnlnaW5hbHUiLCJvc19vc29iYV9pZCIsIm9zX25hendpc2tvIiwib3NfaW1pZSIsImZvX3N5bWJvbCIsInphX29waXNfd3Nwb2x0d29yY293IiwiemFfd3lkYW5pZSIsInphX3RvbXkiLCJ6YV9pbnN0eXR1Y2phIiwid3lfd3lkYXduaWN0d29faWQiLCJ3eV9taWVqc2NlIiwid3lfbmF6d2EiLCJ6YV9yb2tfd3lkYW5pYSIsInphX29waXNfZml6eWN6bnlfa3NpYXpraSIsInphX3NlcmlhX3d5ZGF3bmljemEiLCJ0d19uYXp3aXNrbyIsInR3X2ltaWUiLCJwcmFjb3duaWsiLCJ6YV9hZG5vdGFjamUiLCJCTl9VUkwiKQ0KDQojemFzeWduYWxpem93YW5pZSBuaWVwb3ByYXduZWdvIGtvZG93YW5pYQ0KeCA8LSAxOihsZW5ndGgocG9sYWN6b25lKS0yKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICBwb2xhY3pvbmUkemFfYWRub3RhY2plIDwtIGlmZWxzZShncmVwbCgiPFVcXCsoLi4uLik+Iixwb2xhY3pvbmVbLGldKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG5jaGFyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpIT0wLHBhc3RlKHBvbGFjem9uZSR6YV9hZG5vdGFjamUscGFzdGUoIlVXQUdBISBCxYLEhWQga29kb3dhbmlhIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIFpuYWpkxbogZnJhesSZIFwiPz8/XCIgaSB6cmVkYWd1aiBwb2xlIixzZXAgPSAiIiksc2VwID0gIiMgIikscGFzdGUoIlVXQUdBISBCxYLEhWQga29kb3dhbmlhIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIFpuYWpkxbogZnJhesSZIFwiPz8/XCIgaSB6cmVkYWd1aiBwb2xlIixzZXAgPSAiIikpLGFzLmNoYXJhY3Rlcihwb2xhY3pvbmUkemFfYWRub3RhY2plKSkNCiAgcG9sYWN6b25lWyxpXSA8LSBnc3ViKCI8VVxcKyguLi4uKT4iLCAiPz8/IiwgcG9sYWN6b25lWyxpXSkNCn0NCiN6YXN5Z25hbGl6b3dhbmllIG9iZWNub8WbY2kgem5ha3UgJCB3IGt0w7NyeW3FmyB6IHDDs2wNClggPC0gMToobGVuZ3RoKHBvbGFjem9uZSktMikNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgcG9sYWN6b25lJHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoZ3JlcGwoIlxcJCIscG9sYWN6b25lWyxpXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShuY2hhcihwb2xhY3pvbmUkemFfYWRub3RhY2plKT09MCxwYXN0ZSgiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGLFgsSZZG55IHphcGlzIEJOIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIHd5ZHJ1a293YW5vIHpuYWsgXCIkXCIuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxwYXN0ZShwb2xhY3pvbmUkemFfYWRub3RhY2plLHBhc3RlKCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEgYsWCxJlkbnkgemFwaXMgQk4gdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgd3lkcnVrb3dhbm8gem5hayBcIiRcIi4gWnJlZGFndWogdHJlxZvEhyBwb2xhLiIsc2VwID0gIiIpLHNlcCA9ICIjICIpKSxhcy5jaGFyYWN0ZXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSkpDQp9DQojemFzeWduYWxpem93YW5pZSBvYmVjbm/Fm2NpIGZyYXp5ICJjaGFyYWN0ZXIoMCkiIHcga3TDs3J5bcWbIHogcMOzbA0KWCA8LSAxOihsZW5ndGgocG9sYWN6b25lKS0yKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICBwb2xhY3pvbmUkemFfYWRub3RhY2plIDwtIGlmZWxzZShncmVwbCgiY2hhcmFjdGVyXFwoMFxcKSIscG9sYWN6b25lWyxpXSksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShuY2hhcihwb2xhY3pvbmUkemFfYWRub3RhY2plKT09MCxwYXN0ZSgiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGLFgsSZZG55IHphcGlzIEJOIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIHd5ZHJ1a293YW5vIGZyYXrEmSBcImNoYXJhY3RlcigwKVwiLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIikscGFzdGUocG9sYWN6b25lJHphX2Fkbm90YWNqZSxwYXN0ZSgiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGLFgsSZZG55IHphcGlzIEJOIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIHd5ZHJ1a293YW5vIGZyYXrEmSBcImNoYXJhY3RlcigwKVwiLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIiksc2VwID0gIiMgIikpLGFzLmNoYXJhY3Rlcihwb2xhY3pvbmUkemFfYWRub3RhY2plKSkNCn0NCiN6YXN5Z25hbGl6b3dhbmllIG9iZWNub8WbY2kgem5ha3UgIyB3IG9waXNpZSB3c3DDs8WCdHfDs3Jjw7N3DQpwb2xhY3pvbmUkemFfYWRub3RhY2plIDwtIGlmZWxzZShncmVwbCgiXFwjIixwb2xhY3pvbmUkemFfb3Bpc193c3BvbHR3b3Jjb3cpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UobmNoYXIocG9sYWN6b25lJHphX2Fkbm90YWNqZSk9PTAsIlVXQUdBISBaZSB3emdsxJlkdSBuYSBrb25mbGlrdCB3IG9waXNpZSB3c3DDs8WCdHfDs3Jjw7N3IHd5Ymllcnogd8WCYcWbY2l3xIUgd2FydG/Fm8SHIChzdHJlZmEgb2Rwb3dpZWR6aWFsbm/Fm2NpIFwiI1wiIHdzcMOzxYJ0d8OzcmN5IHogcG9sYSA3MDApIixwYXN0ZShwb2xhY3pvbmUkemFfYWRub3RhY2plLCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEga29uZmxpa3QgdyBvcGlzaWUgd3Nww7PFgnR3w7NyY8OzdyB3eWJpZXJ6IHfFgmHFm2Npd8SFIHdhcnRvxZvEhyAoc3RyZWZhIG9kcG93aWVkemlhbG5vxZtjaSAjIHdzcMOzxYJ0d8OzcmN5IHogcG9sYSA3MDApIixzZXAgPSAiIyAiKSksYXMuY2hhcmFjdGVyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpKQ0KDQpvdXQgPC0gY1NwbGl0KHBvbGFjem9uZSwgYygiYW1fYXV0b3JfaWQiLCAiYW1fbmF6d2lza28iLCAiYW1faW1pZSIsIm9zX29zb2JhX2lkIiwib3NfbmF6d2lza28iLCAib3NfaW1pZSIsICJmb19zeW1ib2wiLCJ3eV93eWRhd25pY3R3b19pZCIsInd5X21pZWpzY2UiLCJ3eV9uYXp3YSIpLHNlcCA9ICJ8IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICB1bmlxdWUoKQ0KDQpvdXQkcmVrb3JkX0JOIDwtIGlmZWxzZShpcy5uYShvdXQkcmVrb3JkX0JOKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHJla29yZF9CTikpDQpvdXQkcnpfbmF6d2EgPC0gaWZlbHNlKGlzLm5hKG91dCRyel9uYXp3YSksJycsYXMuY2hhcmFjdGVyKG91dCRyel9uYXp3YSkpDQpvdXQkemFfcm9fcm9rIDwtIGlmZWxzZShpcy5uYShvdXQkemFfcm9fcm9rKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3JvX3JvaykpDQpvdXQkemFfdHlwZSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3R5cGUpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfdHlwZSkpDQpvdXQkcnpfcm9kemFqX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkcnpfcm9kemFqX2lkKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHJ6X3JvZHphal9pZCkpDQpvdXQkRFpfTkFaV0EgPC0gaWZlbHNlKGlzLm5hKG91dCREWl9OQVpXQSksJycsYXMuY2hhcmFjdGVyKG91dCREWl9OQVpXQSkpDQpvdXQkRFpfRFpJQUxfSUQgPC0gaWZlbHNlKGlzLm5hKG91dCREWl9EWklBTF9JRCksJycsYXMuY2hhcmFjdGVyKG91dCREWl9EWklBTF9JRCkpDQpvdXQkdHdfdHdvcmNhX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkdHdfdHdvcmNhX2lkKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHR3X3R3b3JjYV9pZCkpDQpvdXQkYW1fYXV0b3JfaWQgPC0gaWZlbHNlKGlzLm5hKG91dCRhbV9hdXRvcl9pZCksJycsYXMuY2hhcmFjdGVyKG91dCRhbV9hdXRvcl9pZCkpDQpvdXQkYW1fbmF6d2lza28gPC0gaWZlbHNlKGlzLm5hKG91dCRhbV9uYXp3aXNrbyksJycsYXMuY2hhcmFjdGVyKG91dCRhbV9uYXp3aXNrbykpDQpvdXQkYW1faW1pZSA8LSBpZmVsc2UoaXMubmEob3V0JGFtX2ltaWUpLCcnLGFzLmNoYXJhY3RlcihvdXQkYW1faW1pZSkpDQpvdXQkemFfdHl0dWwgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV90eXR1bCksJycsYXMuY2hhcmFjdGVyKG91dCR6YV90eXR1bCkpDQpvdXQkemFfdHl0dWxfb3J5Z2luYWx1IDwtIGlmZWxzZShpcy5uYShvdXQkemFfdHl0dWxfb3J5Z2luYWx1KSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3R5dHVsX29yeWdpbmFsdSkpDQpvdXQkemFfamV6eWtfb3J5Z2luYWx1IDwtIGlmZWxzZShpcy5uYShvdXQkemFfamV6eWtfb3J5Z2luYWx1KSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX2plenlrX29yeWdpbmFsdSkpDQpvdXQkb3Nfb3NvYmFfaWQgPC0gaWZlbHNlKGlzLm5hKG91dCRvc19vc29iYV9pZCksJycsYXMuY2hhcmFjdGVyKG91dCRvc19vc29iYV9pZCkpDQpvdXQkb3NfbmF6d2lza28gPC0gaWZlbHNlKGlzLm5hKG91dCRvc19uYXp3aXNrbyksJycsYXMuY2hhcmFjdGVyKG91dCRvc19uYXp3aXNrbykpDQpvdXQkb3NfaW1pZSA8LSBpZmVsc2UoaXMubmEob3V0JG9zX2ltaWUpLCcnLGFzLmNoYXJhY3RlcihvdXQkb3NfaW1pZSkpDQpvdXQkZm9fc3ltYm9sIDwtIGlmZWxzZShpcy5uYShvdXQkZm9fc3ltYm9sKSwnJyxhcy5jaGFyYWN0ZXIob3V0JGZvX3N5bWJvbCkpDQpvdXQkemFfb3Bpc193c3BvbHR3b3Jjb3cgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9vcGlzX3dzcG9sdHdvcmNvdyksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9vcGlzX3dzcG9sdHdvcmNvdykpDQpvdXQkemFfd3lkYW5pZSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3d5ZGFuaWUpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfd3lkYW5pZSkpDQpvdXQkemFfdG9teSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3RvbXkpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfdG9teSkpDQpvdXQkemFfaW5zdHl0dWNqYSA8LSBpZmVsc2UoaXMubmEob3V0JHphX2luc3R5dHVjamEpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfaW5zdHl0dWNqYSkpDQpvdXQkd3lfd3lkYXduaWN0d29faWQgPC0gaWZlbHNlKGlzLm5hKG91dCR3eV93eWRhd25pY3R3b19pZCksJycsYXMuY2hhcmFjdGVyKG91dCR3eV93eWRhd25pY3R3b19pZCkpDQpvdXQkd3lfbWllanNjZSA8LSBpZmVsc2UoaXMubmEob3V0JHd5X21pZWpzY2UpLCcnLGFzLmNoYXJhY3RlcihvdXQkd3lfbWllanNjZSkpDQpvdXQkd3lfbmF6d2EgPC0gaWZlbHNlKGlzLm5hKG91dCR3eV9uYXp3YSksJycsYXMuY2hhcmFjdGVyKG91dCR3eV9uYXp3YSkpDQpvdXQkemFfcm9rX3d5ZGFuaWEgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9yb2tfd3lkYW5pYSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9yb2tfd3lkYW5pYSkpDQpvdXQkemFfb3Bpc19maXp5Y3pueV9rc2lhemtpIDwtIGlmZWxzZShpcy5uYShvdXQkemFfb3Bpc19maXp5Y3pueV9rc2lhemtpKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX29waXNfZml6eWN6bnlfa3NpYXpraSkpDQpvdXQkemFfc2VyaWFfd3lkYXduaWN6YSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3NlcmlhX3d5ZGF3bmljemEpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfc2VyaWFfd3lkYXduaWN6YSkpDQpvdXQkdHdfbmF6d2lza28gPC0gaWZlbHNlKGlzLm5hKG91dCR0d19uYXp3aXNrbyksJycsYXMuY2hhcmFjdGVyKG91dCR0d19uYXp3aXNrbykpDQpvdXQkdHdfaW1pZSA8LSBpZmVsc2UoaXMubmEob3V0JHR3X2ltaWUpLCcnLGFzLmNoYXJhY3RlcihvdXQkdHdfaW1pZSkpDQpvdXQkcHJhY293bmlrIDwtIGlmZWxzZShpcy5uYShvdXQkcHJhY293bmlrKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHByYWNvd25paykpDQpvdXQkemFfYWRub3RhY2plIDwtIGlmZWxzZShpcy5uYShvdXQkemFfYWRub3RhY2plKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX2Fkbm90YWNqZSkpDQpvdXQkQk5fVVJMIDwtIGlmZWxzZShpcy5uYShvdXQkQk5fVVJMKSwnJyxhcy5jaGFyYWN0ZXIob3V0JEJOX1VSTCkpDQoNCm91dCAlJCUgIA0KICAgIHsgcmVrb3JkX0JOPT1sYWcocmVrb3JkX0JOLCkgJiByel9uYXp3YT09bGFnKHJ6X25hendhLCkgJiB6YV9yb19yb2s9PWxhZyh6YV9yb19yb2ssKSAmIHphX3R5cGU9PWxhZyh6YV90eXBlLCkgJiByel9yb2R6YWpfaWQ9PWxhZyhyel9yb2R6YWpfaWQsKSAmIERaX05BWldBPT1sYWcoRFpfTkFaV0EsKSAmIERaX0RaSUFMX0lEPT1sYWcoRFpfRFpJQUxfSUQsKSAmIHR3X3R3b3JjYV9pZD09bGFnKHR3X3R3b3JjYV9pZCwpICYgemFfdHl0dWw9PWxhZyh6YV90eXR1bCwpICYgemFfdHl0dWxfb3J5Z2luYWx1PT1sYWcoemFfdHl0dWxfb3J5Z2luYWx1LCkgJiB6YV9qZXp5a19vcnlnaW5hbHU9PWxhZyh6YV9qZXp5a19vcnlnaW5hbHUsKSAmIHphX29waXNfd3Nwb2x0d29yY293PT1sYWcoemFfb3Bpc193c3BvbHR3b3Jjb3csKSAmIHphX3d5ZGFuaWU9PWxhZyh6YV93eWRhbmllLCkgJiB6YV90b215PT1sYWcoemFfdG9teSwpICYgemFfaW5zdHl0dWNqYT09bGFnKHphX2luc3R5dHVjamEsKSAmIHphX3Jva193eWRhbmlhPT1sYWcoemFfcm9rX3d5ZGFuaWEsKSAmIHphX29waXNfZml6eWN6bnlfa3NpYXpraT09bGFnKHphX29waXNfZml6eWN6bnlfa3NpYXpraSwpICYgemFfc2VyaWFfd3lkYXduaWN6YT09bGFnKHphX3NlcmlhX3d5ZGF3bmljemEsKSAmIHR3X25hendpc2tvPT1sYWcodHdfbmF6d2lza28sKSAmIHR3X2ltaWU9PWxhZyh0d19pbWllLCkgJiBwcmFjb3duaWs9PWxhZyhwcmFjb3duaWssKSAmIHphX2Fkbm90YWNqZT09bGFnKHphX2Fkbm90YWNqZSwpICYgQk5fVVJMPT1sYWcoQk5fVVJMLCl9ICU+JSANCiAgICBhcy5udW1lcmljKCkgJT4lIA0KICAgIHsufSAtPiBvdXQkc2FtZQ0Kb3V0JHNhbWVbMV0gPC0gMA0Kb3V0JGR6aWVsb25lIDwtIHBhc3RlKG91dCRhbV9hdXRvcl9pZCxvdXQkYW1fbmF6d2lza28sb3V0JGFtX2ltaWUsb3V0JG9zX29zb2JhX2lkLG91dCRvc19uYXp3aXNrbyxvdXQkb3NfaW1pZSxvdXQkZm9fc3ltYm9sLG91dCR3eV93eWRhd25pY3R3b19pZCxvdXQkd3lfbWllanNjZSxvdXQkd3lfbmF6d2Esc2VwID0gIiIpDQoNCm91dCA8LSBvdXQgJT4lDQogIGZpbHRlcighKHNhbWU9PTEmZHppZWxvbmU9PSIiKSkgJT4lDQogIHNlbGVjdCgxOjMzKQ0KDQpvdXQgJSQlICANCiAgICB7IHJla29yZF9CTj09bGFnKHJla29yZF9CTiwpICYgcnpfbmF6d2E9PWxhZyhyel9uYXp3YSwpICYgemFfcm9fcm9rPT1sYWcoemFfcm9fcm9rLCkgJiB6YV90eXBlPT1sYWcoemFfdHlwZSwpICYgcnpfcm9kemFqX2lkPT1sYWcocnpfcm9kemFqX2lkLCkgJiBEWl9OQVpXQT09bGFnKERaX05BWldBLCkgJiBEWl9EWklBTF9JRD09bGFnKERaX0RaSUFMX0lELCkgJiB0d190d29yY2FfaWQ9PWxhZyh0d190d29yY2FfaWQsKSAmIHphX3R5dHVsPT1sYWcoemFfdHl0dWwsKSAmIHphX3R5dHVsX29yeWdpbmFsdT09bGFnKHphX3R5dHVsX29yeWdpbmFsdSwpICYgemFfamV6eWtfb3J5Z2luYWx1PT1sYWcoemFfamV6eWtfb3J5Z2luYWx1LCkgJiB6YV9vcGlzX3dzcG9sdHdvcmNvdz09bGFnKHphX29waXNfd3Nwb2x0d29yY293LCkgJiB6YV93eWRhbmllPT1sYWcoemFfd3lkYW5pZSwpICYgemFfdG9teT09bGFnKHphX3RvbXksKSAmIHphX2luc3R5dHVjamE9PWxhZyh6YV9pbnN0eXR1Y2phLCkgJiB6YV9yb2tfd3lkYW5pYT09bGFnKHphX3Jva193eWRhbmlhLCkgJiB6YV9vcGlzX2Zpenljem55X2tzaWF6a2k9PWxhZyh6YV9vcGlzX2Zpenljem55X2tzaWF6a2ksKSAmIHphX3NlcmlhX3d5ZGF3bmljemE9PWxhZyh6YV9zZXJpYV93eWRhd25pY3phLCkgJiB0d19uYXp3aXNrbz09bGFnKHR3X25hendpc2tvLCkgJiB0d19pbWllPT1sYWcodHdfaW1pZSwpICYgcHJhY293bmlrPT1sYWcocHJhY293bmlrLCkgJiB6YV9hZG5vdGFjamU9PWxhZyh6YV9hZG5vdGFjamUsKSAmIEJOX1VSTD09bGFnKEJOX1VSTCwpfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gb3V0JHNhbWUNCg0KI3VjacSZY2llIHpieXQgZMWCdWdpY2ggY2nEhWfDs3cgem5ha8OzdywgYnkgd2VzesWCeSBkbyBvcmFjbGUnYQ0KZGx1Z29zY2kgPC0gZGF0YS5mcmFtZShwb2xlID0gYygiYW1fbmF6d2lza28iLCAiYW1faW1pZSIsICJ6YV90eXR1bCIsICJ6YV90eXR1bF9vcnlnaW5hbHUiLCAiemFfamV6eWtfb3J5Z2luYWx1IiwgIm9zX25hendpc2tvIiwgIm9zX2ltaWUiLCAiemFfb3Bpc193c3BvbHR3b3Jjb3ciLCAiemFfaW5zdHl0dWNqYSIsICJ3eV9taWVqc2NlIiwgInd5X25hendhIiwgInphX29waXNfZml6eWN6bnlfa3NpYXpraSIsICJ6YV9zZXJpYV93eWRhd25pY3phIiwgInR3X25hendpc2tvIiwgInR3X2ltaWUiLCAiemFfYWRub3RhY2plIiksIGxpY3piYV96bmFrb3cgPSBjKDUwLDQwLDUwMCw1MDAsMTAwLDUwLDQwLDUwMCwyNTUsNDAsMjU1LDEwMDAsMjU1LDIwMCw0MCwyMDAwKSkNCnggPC0gbWF0Y2goZGx1Z29zY2kkcG9sZSxuYW1lcyhvdXQpKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICBkbHVnb3NjIDwtIGRsdWdvc2NpJGxpY3piYV96bmFrb3dbbWF0Y2gobmFtZXMob3V0W2ldKSxkbHVnb3NjaSRwb2xlKV0NCiAgb3V0JHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoZGx1Z29zYzxuY2hhcihhcy5jaGFyYWN0ZXIob3V0WyxpXSkpJm91dCR6YV9hZG5vdGFjamUhPSIiLHBhc3RlKG91dCR6YV9hZG5vdGFjamUscGFzdGUoIlVXQUdBISBQb2xlICIsYXMuY2hhcmFjdGVyKG5hbWVzKG91dFtpXSkpLCIgYnnFgm8gemJ5dCBkxYJ1Z2llIGkgem9zdGHFgm8gcHJ6eWNpxJl0ZS4gWnJlZGFndWogdHJlxZvEhyBwb2xhLiIsc2VwID0gIiIpLHNlcCA9ICIjICIpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZGx1Z29zYzxuY2hhcihhcy5jaGFyYWN0ZXIob3V0WyxpXSkpJm91dCR6YV9hZG5vdGFjamU9PSIiLHBhc3RlKCJVV0FHQSEgUG9sZSAiLGFzLmNoYXJhY3RlcihuYW1lcyhvdXRbaV0pKSwiIGJ5xYJvIHpieXQgZMWCdWdpZSBpIHpvc3RhxYJvIHByenljacSZdGUuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxhcy5jaGFyYWN0ZXIob3V0JHphX2Fkbm90YWNqZSkpKQ0KICANCiAgb3V0WyxpXSA8LSBpZmVsc2UoZGx1Z29zYzxuY2hhcihhcy5jaGFyYWN0ZXIob3V0WyxpXSkpLGFzLmNoYXJhY3RlcihzdWJzdHIob3V0WyxpXSwxLGRsdWdvc2MpKSxhcy5jaGFyYWN0ZXIob3V0WyxpXSkpDQp9DQoNCm91dCRyZWtvcmRfQk5bb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCRyel9uYXp3YVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3JvX3Jva1tvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3R5cGVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCRyel9yb2R6YWpfaWRbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCREWl9OQVpXQVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JERaX0RaSUFMX0lEW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkdHdfdHdvcmNhX2lkW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfdHl0dWxbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV90eXR1bF9vcnlnaW5hbHVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9qZXp5a19vcnlnaW5hbHVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9vcGlzX3dzcG9sdHdvcmNvd1tvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3d5ZGFuaWVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV90b215W291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfaW5zdHl0dWNqYVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3Jva193eWRhbmlhW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfb3Bpc19maXp5Y3pueV9rc2lhemtpW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfc2VyaWFfd3lkYXduaWN6YVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHR3X25hendpc2tvW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkdHdfaW1pZVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHByYWNvd25pa1tvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX2Fkbm90YWNqZVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JEJOX1VSTFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0KDQpvdXQgPC0gb3V0ICU+JQ0KICBzZWxlY3QoMTozMykNCg0KI3DEmXRsYSB6YXBpc3VqxIVjYSBwbyBvay4gMjAwMCB3aWVyc3p5IHogdXd6Z2zEmWRuaWVuaWVtIGtvbXBsZXRub8WbY2kgcmVrb3Jkw7N3IGJpYmxpb2dyYWZpY3pueWNoIHJvenBpc2FueWNoIG5hIGtpbGthIHdpZXJzenkNCm91dCA8LSBvdXQgJT4lDQogIG11dGF0ZShwb2R6aWFsID0gaWZlbHNlKHJla29yZF9CTiE9IiIsYXMuY2hhcmFjdGVyKHJla29yZF9CTiksTkEpKSAlPiUNCiAgZmlsbChwb2R6aWFsKQ0KaWxlIDwtIHVuaXF1ZShvdXQkcG9kemlhbCkNCmlsZSA8LSBzcGxpdCh1bmlxdWUoaWxlKSwgY2VpbGluZyhzZXFfYWxvbmcodW5pcXVlKGlsZSkpLzE1MDApKQ0KeCA8LSAxOmxlbmd0aChpbGUpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIGZpbmFsIDwtIG91dCAlPiUNCiAgICBmaWx0ZXIocG9kemlhbCAlaW4lIGlsZVtbaV1dKSAlPiUNCiAgICBzZWxlY3QoLXBvZHppYWwpDQogIHdyaXRlLnhsc3goZmluYWwsIHBhc3RlKCJDOi9Vc2Vycy8iLGVtcGxveWVlX25hbWUsIi9EZXNrdG9wLyIsaW1wb3J0X3llYXIsIl9hbnRvbG9naWVfZG9faW1wb3J0dSIsaSwiLnhsc3giLHNlcCA9ICIiKSxzaGVldE5hbWUgPSAiZ290b3dlIikNCn0NCmBgYA0KDQpgYGB7ciBrc2nEhcW8a2kgd3Nww7PFgnd5ZGFuaWF9DQpibl9vayA8LSBjaHVuazExDQpkYXRhIDwtIGJuX29rICU+JQ0KICBmaWx0ZXIocm9kemFqX2tzaWF6a2k9PSJ3c3DDs8WCd3lkYW5pZSIpICU+JQ0KICBtdXRhdGUocmVkYWt0b3JfZHppYWx1ID0gcGFzdGUocmVkYWt0b3JfZHppYWx1LCJfd3NwIixzZXAgPSAiIikpDQoNCiN1d29sbmllbmllIGtvbHVtbiB6IGRhbnltaSB6IGJuIGkgcHJ6ZXR3b3J6ZW5pZSBkbyBQQkwNCiMxOiB6YV91d2FnaSwgcnpfbmF6d2EsIHphX3JvX3JvaywgemFfdHlwZSwgcnpfcm9kemFqX2lkLCB0d190d29yY2FfaWQsIHR3X25hendpc2tvLCB0d19pbWllLCBkel9kemlhbF9pZCwgZHpfbmF6d2EsIHJlZGFrdG9yX2R6aWFsdQ0KcG9sYV9wYmwgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLCBSWl9OQVpXQSwgWkFfUk9fUk9LID0gcm9rLCBSWl9ST0RaQUpfSUQsIFRXX1RXT1JDQV9JRCwgVFdfTkFaV0lTS08sIFRXX0lNSUUsIERaX0RaSUFMX0lELCBEWl9OQVpXQSwgcmVkYWt0b3JfZHppYWx1KSAlPiUNCiAgbXV0YXRlKFpBX1RZUEUgPSAiS1MiKQ0KDQojMjogYXV0b3INCkJOX2F1dG9yIDwtIGRhdGEgJT4lIA0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NSkgJT4lIA0KICBtdXRhdGUoWDI0NSA9IHN0cl9leHRyYWN0KFgyNDUsICIoPzw9XFwvXFwkYykoLio/KSg/PSA7fCQpIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCJcXC4kIiksDQogICAgICAgICBYMjQ1ID0gc3RyX3JlbW92ZShYMjQ1LCJcXFsiKSwNCiAgICAgICAgIFgyNDUgPSBzdHJfcmVtb3ZlKFgyNDUsIlxcXSIpLA0KICAgICAgICAgQU1fTkFaV0lTS08gPSBpZmVsc2UoZ3JlcGwoIiBbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvlxcLl0qICIsWDI0NSksYXMuY2hhcmFjdGVyKFgyNDUpLHN0cl9yZXBsYWNlKFgyNDUsIiheLio/KSggKSg/IS4qICkoLiokKSIsIlxcMyIpKSwNCiAgICAgICAgIEFNX0lNSUUgPSBpZmVsc2UoZ3JlcGwoIiBbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvlxcLl0qICIsWDI0NSksIioiLHN0cl9yZXBsYWNlKFgyNDUsIiheLio/KSggKSg/IS4qICkoLiokKSIsIlxcMSIpKSwNCiAgICAgICAgIG5hendhID0gc3RyX3JlcGxhY2VfYWxsKHN0cl90b19sb3dlcihwYXN0ZShBTV9OQVpXSVNLTyxBTV9JTUlFLCBzZXAgPSAiIikpLCAiXFxXIiwgIiIpKSAlPiUNCiAgbGVmdF9qb2luKC4sUEJMX2F1dG9yenkgJT4lIHNlbGVjdChBTV9BVVRPUl9JRCxBTV9LUllQVE9OSU0sQU1fTElDWkJBX1pBUElTT1csbmF6d2EpICU+JSBmaWx0ZXIoaXMubmEoQU1fS1JZUFRPTklNKSksYnk9Im5hendhIikgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksQU1fTkFaV0lTS08sQU1fSU1JRSwtQU1fTElDWkJBX1pBUElTT1cpDQpCTl9hdXRvciRpZF9ncnVweSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQoQk5fYXV0b3JbMTo0XSkpDQpCTl9hdXRvciA8LSBCTl9hdXRvclshZHVwbGljYXRlZChCTl9hdXRvciRpZF9ncnVweSksXSAlPiUNCiAgbXV0YXRlKFpBX0FETk9UQUNKRSA9IE5BKSAlPiUgDQogIHNlbGVjdChaQV9VV0FHSSxBTV9OQVpXSVNLTyxBTV9JTUlFLFpBX0FETk9UQUNKRSxBTV9BVVRPUl9JRCkNCg0KIzM6IHR5dHXFgg0KI3BvbGUgMjQ1DQptYXJjX2ZpZWxkXzI0NSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDI0NSklPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwifiIpLA0KICAgICAgICAgWDI0NT1zdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMjQ1IixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgyNDUhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNDU9c3RyX3JlbW92ZV9hbGwoWDI0NSwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMjQ1LCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDI0NSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI0NSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNDU8LWNiaW5kKG1hcmNfZmllbGRfMjQ1LGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjQ1JFgyNDUgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNDUkWDI0NSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8yNDVbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8yNDUkWDI0NSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMjQ1JFgyNDUpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCmlmKCIkbiIgJWluJSBjb2xuYW1lcyhtYXJjX2ZpZWxkXzI0NSkpIHsNCm1hcmNfZmllbGRfMjQ1IDwtIG1hcmNfZmllbGRfMjQ1ICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRhYCxgJGJgLGAkbmAsYCRwYCkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKGAkYWAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRhYCksIiIsYXMuY2hhcmFjdGVyKGAkYWApKSxjb2xsYXBzZSA9ICIgIiksDQogICAgICAgICBgJGJgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYmApLCIiLGFzLmNoYXJhY3RlcihgJGJgKSksY29sbGFwc2UgPSAiICIpLA0KICAgICAgICAgYCRuYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJG5gKSwiIixhcy5jaGFyYWN0ZXIoYCRuYCkpLGNvbGxhcHNlID0gIiAiKSwNCiAgICAgICAgIGAkcGAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRwYCksIiIsYXMuY2hhcmFjdGVyKGAkcGApKSxjb2xsYXBzZSA9ICIgIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICB1bml0ZSgiWkFfVFlUVUwiLGAkYWA6YCRwYCxzZXAgPSAiICIsbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZShaQV9UWVRVTCA9IHN0cl9yZXBsYWNlX2FsbChaQV9UWVRVTCwiICsiLCIgIiksDQogICAgICAgICBaQV9UWVRVTCA9IHN0cl9yZW1vdmUoWkFfVFlUVUwsICJcXHMrXFwvXFxzezAsfSQiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxXFwyXFxVXFw1XFw2IixwZXJsID0gVFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixaQV9UWVRVTCksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLGFzLmNoYXJhY3RlcihaQV9UWVRVTCkpKSkpLA0KICAgICAgICAgWkFfVFlUVUwgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWkFfVFlUVUwpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLFpBX1RZVFVMKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxaQV9UWVRVTCksYXMuY2hhcmFjdGVyKFpBX1RZVFVMKSkpKSksDQogICAgICAgICBaQV9UWVRVTCA9IHN0cl9yZXBsYWNlX2FsbChaQV9UWVRVTCwiXFwuezN9IFxcLnszfSIsIi4uLiAiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gc3RyX3JlcGxhY2VfYWxsKFpBX1RZVFVMLCIgOyAiLCIuICIpLA0KICAgICAgICAgWkFfVFlUVUwgPSBnc3ViKCIoIDogKSguKSIsIi4gXFxVXFwyIixwZXJsPVRSVUUsWkFfVFlUVUwpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFpBX1RZVFVMKQ0KfSBlbHNlIHsNCiAgbWFyY19maWVsZF8yNDUgPC0gbWFyY19maWVsZF8yNDUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgLGAkYmApICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShgJGFgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksY29sbGFwc2UgPSAiICIpLA0KICAgICAgICAgYCRiYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGJgKSwiIixhcy5jaGFyYWN0ZXIoYCRiYCkpLGNvbGxhcHNlID0gIiAiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIHVuaXRlKCJaQV9UWVRVTCIsYCRhYDpgJGJgLHNlcCA9ICIgIixuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKFpBX1RZVFVMID0gc3RyX3JlcGxhY2VfYWxsKFpBX1RZVFVMLCIgKyIsIiAiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gc3RyX3JlbW92ZShaQV9UWVRVTCwgIlxccytcXC9cXHN7MCx9JCIpLA0KICAgICAgICAgWkFfVFlUVUwgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLFpBX1RZVFVMKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKFxcKHxcXFspKC4pIiwiXFwxLlxcMlxcNVxcVVxcNiIscGVybD1UUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWkFfVFlUVUwpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLFpBX1RZVFVMKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoLikiLFpBX1RZVFVMKSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxaQV9UWVRVTCksYXMuY2hhcmFjdGVyKFpBX1RZVFVMKSkpKSksDQogICAgICAgICBaQV9UWVRVTCA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWkFfVFlUVUwpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKFxcKHxcXFspKC4pIixaQV9UWVRVTCksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWkFfVFlUVUwpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsWkFfVFlUVUwpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxaQV9UWVRVTCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKSguKSIsWkFfVFlUVUwpLGdzdWIoIihcXFcpKCApKDp8OykoICkoLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFpBX1RZVFVMKSxhcy5jaGFyYWN0ZXIoWkFfVFlUVUwpKSkpKSwNCiAgICAgICAgIFpBX1RZVFVMID0gc3RyX3JlcGxhY2VfYWxsKFpBX1RZVFVMLCJcXC57M30gXFwuezN9IiwiLi4uICIpLA0KICAgICAgICAgWkFfVFlUVUwgPSBzdHJfcmVwbGFjZV9hbGwoWkFfVFlUVUwsIiA7ICIsIi4gIiksDQogICAgICAgICBaQV9UWVRVTCA9IGdzdWIoIiggOiApKC4pIiwiLiBcXFVcXDIiLHBlcmw9VFJVRSxaQV9UWVRVTCkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWkFfVFlUVUwpDQp9DQp0eXR1bF93c3BvbHd5ZGFuaWUgPC0gbWFyY19maWVsZF8yNDUNCiNkb3Bpc2FuaWUgZ2F0dW5rdSBkbyBwcnplZG1pb3Rvd2VqIG5hIHBvZHN0YXdpZSA2NTUgaSA2NTAgIA0KZ2F0dW5raV9wYmwgPC0gZGF0YS5mcmFtZShnYXR1bmVrID0gYygiYWZvcnl6bSIsICJhbGJ1bSIsICJhbnRvbG9naWEiLCAiYXV0b2Jpb2dyYWZpYSIsICJkemllbm5payIsICJlc2VqIiwgImZlbGlldG9uIiwgImlubmUiLCAia2F6YW5pZSIsICJsaXN0IiwgIm1pbmlhdHVyYSBwcm96xIUiLCAib3Bvd2lhZGFuaWUiLCAicG9lbWF0IiwgInBvd2llxZvEhyIsICJwcm96YSIsICJwcm96YSBwb2V0eWNrYSIsICJyZXBvcnRhxbwiLCAicm96bXnFm2xhbmllIHJlbGlnaWpuZSIsICJyeXN1bmVrLCBvYnJheiIsICJzY2VuYXJpdXN6IiwgInN6a2ljIiwgInRla3N0IGJpYmxpam55IiwgInRla3N0IGRyYW1hdHljem55IiwgImRyYW1hdCIsICJ3aWVyc3oiLCAid3Nwb21uaWVuaWEiLCAid3lwb3dpZWTFuiIsICJwYW1pxJl0bmlraSIsICJwb2V6amEiLCAibGl0ZXJhdHVyYSBwb2Ryw7PFvG5pY3phIiwgInNhdHlyYSIsICJwaW9zZW5rYSIpKQ0KDQojZHJhbWF0LCBwYW1pxJl0bmlraSwgcG9lemphLCBsaXRlcmF0dXJhIHBvZHLDs8W8bmljemEsIHNhdHlyYSwgcGlvc2Vua2ENCmdhdHVua2lfYm4gPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg2NTUsWDY1MCkNCg0KZ2F0dW5raV9ibiA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgZnJvbSBnYXR1bmtpX2JuDQogICAgICAgICAgICAgICAgICAgIGxlZnQgam9pbiBnYXR1bmtpX3BibCBvbiBsb3dlcihnYXR1bmtpX2JuLlg2NTUpIGxpa2UgJyUnfHxnYXR1bmtpX3BibC5nYXR1bmVrfHwnJSciKQ0KZ2F0dW5raV9ibiA8LSBzcWxkZigic2VsZWN0ICoNCiAgICAgICAgICAgICAgICAgICAgICBmcm9tIGdhdHVua2lfYm4NCiAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGpvaW4gZ2F0dW5raV9wYmwgb24gbG93ZXIoZ2F0dW5raV9ibi5YNjUwKSBsaWtlICclJ3x8Z2F0dW5raV9wYmwuZ2F0dW5la3x8JyUnIikNCmNvbG5hbWVzKGdhdHVua2lfYm4pWzVdIDwtICJnYXR1bmVrMiINCmdhdHVua2lfYm4gPC0gZ2F0dW5raV9ibiAlPiUNCiAgbXV0YXRlKGdhdHVuZWsgPSBpZmVsc2UoaXMubmEoZ2F0dW5laykmIWlzLm5hKGdhdHVuZWsyKSxhcy5jaGFyYWN0ZXIoZ2F0dW5lazIpLGFzLmNoYXJhY3RlcihnYXR1bmVrKSksDQogICAgICAgICBnYXR1bmVrID0gaWZlbHNlKGdyZXBsKCJwcnp5cG93aWXFm8SHIixYNjU1LGlnbm9yZS5jYXNlID0gVFJVRSkmIWdyZXBsKCJbXnldcG93aWXFm8SHIixYNjU1KSZnYXR1bmVrPT0icG93aWXFm8SHIiwib3Bvd2lhZGFuaWUiLGFzLmNoYXJhY3RlcihnYXR1bmVrKSkpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGdhdHVuZWspKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGdhdHVuZWspICU+JQ0KICBtdXRhdGUoZ2F0dW5layA9IGlmZWxzZShnYXR1bmVrPT0iZHJhbWF0IiwidGVrc3QgZHJhbWF0eWN6bnkiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ2F0dW5laz09InBhbWnEmXRuaWtpIiwid3Nwb21uaWVuaWEiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdhdHVuZWs9PSJwb2V6amEiLCJ3aWVyc3oiLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShnYXR1bmVrPT0ibGl0ZXJhdHVyYSBwb2Ryw7PFvG5pY3phIiwicmVwb3J0YcW8IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdhdHVuZWs9PSJwaW9zZW5rYSIsIndpZXJzeiIsYXMuY2hhcmFjdGVyKGdhdHVuZWspKSkpKSkpICU+JQ0KICBncm91cF9ieShaQV9VV0FHSSkgJT4lDQogIG11dGF0ZShnYXR1bmVrID0gcGFzdGUoZ2F0dW5layxjb2xsYXBzZSA9ICIsICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKGdhdHVuZWsgPSBnc3ViKCIoXi4pIiwiXFxVXFwxIixwZXJsID0gVFJVRSwgZ2F0dW5laykpDQojcG/FgsSFY3plbmllIHR5dHXFgnUgeiBnYXR1bmtpZW0NCnphX3R5dHVsIDwtIG1hcmNfZmllbGRfMjQ1ICU+JQ0KICBsZWZ0X2pvaW4oLixnYXR1bmtpX2JuLGJ5PSJaQV9VV0FHSSIpICU+JSANCiAgbXV0YXRlKGdhdHVuZWsgPSBwYXN0ZSgiWyIsZ2F0dW5laywiXSIsc2VwID0gIiIpLA0KICAgICAgICAgZ2F0dW5layA9IGlmZWxzZShnYXR1bmVrPT0iW05BXSIsTkEsYXMuY2hhcmFjdGVyKGdhdHVuZWspKSkgJT4lIA0KICB1bml0ZSgiWkFfVFlUVUwiLCBaQV9UWVRVTDpnYXR1bmVrLCBzZXAgPSAiLiAiLG5hLnJtPVRSVUUpICU+JSANCiAgbXV0YXRlKFpBX1RZVFVMID0gc3RyX3JlcGxhY2VfYWxsKFpBX1RZVFVMLCJcXC4gXFwuIiwiLiAiKSwNCiAgICAgICAgIFpBX1RZVFVMID0gc3RyX3JlcGxhY2UoWkFfVFlUVUwsIihcXCEpKFxcLil8KFxcPykoXFwuKSIsIlxcMSIpKQ0KDQojNDogdHl0dcWCIG9yeWdpbmHFgnUNCiNwb2xlIDI0Ng0KbWFyY19maWVsZF8yNDYgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDYpJT4lDQogIGZpbHRlcihYMjQ2IT0iIikgJT4lDQogIG11dGF0ZShYMjQ2PXN0cl9yZW1vdmVfYWxsKFgyNDYsIn4iKSwNCiAgICAgICAgIFgyNDY9c3RyX3JlcGxhY2VfYWxsKFgyNDYsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDI0NiIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMjQ2IT0iIikgJT4lDQogIG11dGF0ZShYMjQ2PXN0cl9yZW1vdmVfYWxsKFgyNDYsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NiwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDYsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8yNDYpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMjQ2PC1jYmluZChtYXJjX2ZpZWxkXzI0NixlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzI0NiRYMjQ2IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMjQ2JFgyNDYsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMjQ2WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMjQ2JFgyNDYpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzI0NiRYMjQ2KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQppZigiJG4iICVpbiUgY29sbmFtZXMobWFyY19maWVsZF8yNDYpKSB7DQptYXJjX2ZpZWxkXzI0NiA8LSBtYXJjX2ZpZWxkXzI0NlssIGNvbFN1bXMoaXMubmEobWFyY19maWVsZF8yNDYpKSAhPSBucm93KG1hcmNfZmllbGRfMjQ2KV0gJT4lDQogIGZpbHRlcihncmVwbCgib3J5ZyIsWDI0NikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRhYCxgJGJgLGAkbmAsYCRwYCkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKGAkYWAgPSBwYXN0ZShpZmVsc2UoaXMubmEoYCRhYCksIiIsYXMuY2hhcmFjdGVyKGAkYWApKSxjb2xsYXBzZSA9ICIsICIpLA0KICAgICAgICAgYCRiYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGJgKSwiIixhcy5jaGFyYWN0ZXIoYCRiYCkpLGNvbGxhcHNlID0gIiIpLA0KICAgICAgICAgYCRuYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJG5gKSwiIixhcy5jaGFyYWN0ZXIoYCRuYCkpLGNvbGxhcHNlID0gIiIpLA0KICAgICAgICAgYCRwYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJHBgKSwiIixhcy5jaGFyYWN0ZXIoYCRwYCkpLGNvbGxhcHNlID0gIiIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgdW5pdGUoIlgyNDYiLGAkYWA6YCRwYCxzZXAgPSAiICIsbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZShYMjQ2ID0gc3RyX3JlcGxhY2VfYWxsKFgyNDYsIiArIiwiICIpLA0KICAgICAgICAgWDI0NiA9IHN0cl9yZW1vdmUoWDI0NiwgIlxccytcXC9cXHN7MCx9JCIpLA0KICAgICAgICAgWDI0NiA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSxhcy5jaGFyYWN0ZXIoWDI0NikpKSkpLA0KICAgICAgICAgWDI0NiA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApezAsMX0oLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICl7MCwxfSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksYXMuY2hhcmFjdGVyKFgyNDYpKSkpKSwNCiAgICAgICAgIFgyNDYgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NiwiXFwuezN9IFxcLnszfSIsIi4uLiAiKSwNCiAgICAgICAgIFgyNDYgPSBnc3ViKCIoIDogKSguKSIsIi4gXFxVXFwyIixwZXJsPVRSVUUsWDI0NikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIFgyNDYpDQp9IGVsc2UgaWYgKCIkYiIgJWluJSBjb2xuYW1lcyhtYXJjX2ZpZWxkXzI0Nikpew0KICBtYXJjX2ZpZWxkXzI0NiA8LSBtYXJjX2ZpZWxkXzI0NlssIGNvbFN1bXMoaXMubmEobWFyY19maWVsZF8yNDYpKSAhPSBucm93KG1hcmNfZmllbGRfMjQ2KV0gJT4lDQogIGZpbHRlcihncmVwbCgib3J5ZyIsWDI0NikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksYCRhYCxgJGJgKSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoYCRhYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGFgKSwiIixhcy5jaGFyYWN0ZXIoYCRhYCkpLGNvbGxhcHNlID0gIiwgIiksDQogICAgICAgICBgJGJgID0gcGFzdGUoaWZlbHNlKGlzLm5hKGAkYmApLCIiLGFzLmNoYXJhY3RlcihgJGJgKSksY29sbGFwc2UgPSAiIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICB1bml0ZSgiWDI0NiIsYCRhYDpgJGJgLHNlcCA9ICIgIixuYS5ybSA9IFRSVUUpICU+JSANCiAgbXV0YXRlKFgyNDYgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NiwiICsiLCIgIiksDQogICAgICAgICBYMjQ2ID0gc3RyX3JlbW92ZShYMjQ2LCAiXFxzK1xcL1xcc3swLH0kIiksDQogICAgICAgICBYMjQ2ID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICkoLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFgyNDYpLGFzLmNoYXJhY3RlcihYMjQ2KSkpKSksDQogICAgICAgICBYMjQ2ID0gaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLFgyNDYpLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICl7MCwxfSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICl7MCwxfSguKSIsWDI0NiksZ3N1YigiKFxcVykoICkoOnw7KSggKXswLDF9KC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSxhcy5jaGFyYWN0ZXIoWDI0NikpKSkpLA0KICAgICAgICAgWDI0NiA9IHN0cl9yZXBsYWNlX2FsbChYMjQ2LCJcXC57M30gXFwuezN9IiwiLi4uICIpLA0KICAgICAgICAgWDI0NiA9IGdzdWIoIiggOiApKC4pIiwiLiBcXFVcXDIiLHBlcmw9VFJVRSxYMjQ2KSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSwgWDI0NikNCn0gZWxzZSB7DQogIG1hcmNfZmllbGRfMjQ2IDwtIG1hcmNfZmllbGRfMjQ2WywgY29sU3Vtcyhpcy5uYShtYXJjX2ZpZWxkXzI0NikpICE9IG5yb3cobWFyY19maWVsZF8yNDYpXSAlPiUNCiAgZmlsdGVyKGdyZXBsKCJvcnlnIixYMjQ2KSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxgJGFgKSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoYCRhYCA9IHBhc3RlKGlmZWxzZShpcy5uYShgJGFgKSwiIixhcy5jaGFyYWN0ZXIoYCRhYCkpLGNvbGxhcHNlID0gIiwgIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICB1bml0ZSgiWDI0NiIsYCRhYCxzZXAgPSAiICIsbmEucm0gPSBUUlVFKSAlPiUgDQogIG11dGF0ZShYMjQ2ID0gc3RyX3JlcGxhY2VfYWxsKFgyNDYsIiArIiwiICIpLA0KICAgICAgICAgWDI0NiA9IHN0cl9yZW1vdmUoWDI0NiwgIlxccytcXC9cXHN7MCx9JCIpLA0KICAgICAgICAgWDI0NiA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApKC4pIixYMjQ2KSxnc3ViKCIoXFxXKSggKSg6fDspKCApKC4pIiwiXFwxXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSxhcy5jaGFyYWN0ZXIoWDI0NikpKSkpLA0KICAgICAgICAgWDI0NiA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KFxcKHxcXFspKC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDI0NiksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFgyNDYpLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKXswLDF9KC4pIixYMjQ2KSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApezAsMX0oLikiLCJcXDEuXFwyXFxVXFw1IixwZXJsID0gVFJVRSxYMjQ2KSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoXFxXKSggKSg6fDspKCApezAsMX0oLikiLFgyNDYpLGdzdWIoIihcXFcpKCApKDp8OykoICl7MCwxfSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDI0NiksYXMuY2hhcmFjdGVyKFgyNDYpKSkpKSwNCiAgICAgICAgIFgyNDYgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NiwiXFwuezN9IFxcLnszfSIsIi4uLiAiKSwNCiAgICAgICAgIFgyNDYgPSBnc3ViKCIoIDogKSguKSIsIi4gXFxVXFwyIixwZXJsPVRSVUUsWDI0NikpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIFgyNDYpDQp9DQoNCiNwb2xlIDUwMA0KbWFyY19maWVsZF81MDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg1MDApJT4lDQogIGZpbHRlcihYNTAwIT0iIikgJT4lDQogIG11dGF0ZShYNTAwPXN0cl9yZW1vdmVfYWxsKFg1MDAsIn4iKSwNCiAgICAgICAgIFg1MDA9c3RyX3JlcGxhY2VfYWxsKFg1MDAsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDUwMCIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNTAwIT0iIikgJT4lDQogIG11dGF0ZShYNTAwPXN0cl9yZW1vdmVfYWxsKFg1MDAsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDUwMCwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg1MDAsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF81MDApWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNTAwPC1jYmluZChtYXJjX2ZpZWxkXzUwMCxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzUwMCRYNTAwIDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNTAwJFg1MDAsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNTAwWyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNTAwJFg1MDApLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzUwMCRYNTAwKSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzUwMCA8LSBtYXJjX2ZpZWxkXzUwMCAlPiUNCiAgZmlsdGVyKGdyZXBsKCJvcnlnXFwuXFw6IixYNTAwKSkgJT4lDQogIG11dGF0ZShYNTAwID0gc3RyX3JlbW92ZShgJGFgLCJeVHl0XFwuIG9yeWdcXC46IHxeVHl0XFwsIG9yeWdcXC46IHxeLio/dHl0XFwuIG9yeWdcXC46ICIpLA0KICAgICAgICAgWDUwMCA9IHN0cl9yZW1vdmUoWDUwMCwgIlxccytcXC9cXHN7MCx9JCIpLA0KICAgICAgICAgWDUwMCA9IGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDUwMCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMS5cXDJcXDVcXFVcXDYiLHBlcmw9VFJVRSxYNTAwKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsWDUwMCksZ3N1YigiKFxcVykoICkoOnw7KSggKShcXCh8XFxbKSguKSIsIlxcMVxcMlxcVVxcNVxcNiIscGVybCA9IFRSVUUsWDUwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIixYNTAwKSxnc3ViKCIoW2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5JVlhdKSggKSg6fDspKCApKC4pIiwiXFwxLlxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDUwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFxcVykoICkoOnw7KSggKSguKSIsWDUwMCksZ3N1YigiKFxcVykoICkoOnw7KSggKSguKSIsIlxcMVxcMlxcVVxcNSIscGVybCA9IFRSVUUsWDUwMCksYXMuY2hhcmFjdGVyKFg1MDApKSkpKSwNCiAgICAgICAgIFg1MDAgPSBpZmVsc2UoZ3JlcGwoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLFg1MDApLGdzdWIoIihbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvklWWF0pKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDEuXFwyXFw1XFxVXFw2IixwZXJsPVRSVUUsWDUwMCksDQogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLFg1MDApLGdzdWIoIihcXFcpKCApKDp8OykoICkoXFwofFxcWykoLikiLCJcXDFcXDJcXFVcXDVcXDYiLHBlcmwgPSBUUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShncmVwbCgiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsWDUwMCksZ3N1YigiKFthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+SVZYXSkoICkoOnw7KSggKSguKSIsIlxcMS5cXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFg1MDApLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIihcXFcpKCApKDp8OykoICkoLikiLFg1MDApLGdzdWIoIihcXFcpKCApKDp8OykoICkoLikiLCJcXDFcXDJcXFVcXDUiLHBlcmwgPSBUUlVFLFg1MDApLGFzLmNoYXJhY3RlcihYNTAwKSkpKSksDQogICAgICAgICBYNTAwID0gc3RyX3JlcGxhY2VfYWxsKFg1MDAsIlxcLnszfSBcXC57M30iLCIuLi4gIiksDQogICAgICAgICBYNTAwID0gc3RyX3JlbW92ZShYNTAwLCAiXFwuJCIpLA0KICAgICAgICAgWDUwMCA9IHN0cl9yZW1vdmUoWDUwMCwiKCx7MCwxfSB7MCwxfSlcXGR7NH0uKiR8KCwgdHwuIFQpeXQuIG9yeWcuIGN5a2x1OiIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg1MDApDQojdHl0dcWCIG9yeWdpbmHFgnUNCnphX3R5dHVsX29yeWdpbmFsdSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzI0NixieT0iWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF81MDAsYnk9IlpBX1VXQUdJIikgJT4lDQogIG11dGF0ZShYNTAwID0gaWZlbHNlKGlzLm5hKFg1MDApLE5BLA0KICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZ3JlcGwoIm9yeWciLFg1MDApLE5BLGFzLmNoYXJhY3RlcihYNTAwKSkpLA0KICAgICAgICAgWDUwMCA9IGlmZWxzZSghaXMubmEoWDUwMCkmZ3JlcGwoIlxcLiAtICIsWDUwMCksc3RyX3JlcGxhY2UoWDUwMCwiKC4qPykoXFwuIC0gLiokKSIsIlxcMSIpLGFzLmNoYXJhY3RlcihYNTAwKSksDQogICAgICAgICBYNTAwID0gaWZlbHNlKCFpcy5uYShYNTAwKSZncmVwbCgiTmEga3NpxIXFvGNlIHBzZXVkIixYNTAwKSxzdHJfcmVwbGFjZShYNTAwLCIoLio/KShcXC4gTmEga3NpxIXFvGNlIHBzZXVkLiokKSIsIlxcMSIpLGFzLmNoYXJhY3RlcihYNTAwKSksDQogICAgICAgICBYNTAwID0gaWZlbHNlKCFpcy5uYShYNTAwKSZncmVwbCgiUHJ6ZWvFglxcLiB3ZyIsWDUwMCksc3RyX3JlcGxhY2UoWDUwMCwiKC4qPykoXFwuIFByemVrxYJcXC4gd2cuKiQpIiwiXFwxIiksYXMuY2hhcmFjdGVyKFg1MDApKSwNCiAgICAgICAgIFpBX1RZVFVMX09SWUdJTkFMVSA9IGlmZWxzZShpcy5uYShYMjQ2KSZpcy5uYShYNTAwKSxOQSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoIWlzLm5hKFg1MDApLGFzLmNoYXJhY3RlcihYNTAwKSxhcy5jaGFyYWN0ZXIoWDI0NikpKSwNCiAgICAgICAgIFpBX1RZVFVMX09SWUdJTkFMVSA9IHN0cl9yZW1vdmVfYWxsKFpBX1RZVFVMX09SWUdJTkFMVSwnXFwiJykpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWkFfVFlUVUxfT1JZR0lOQUxVKQ0KDQojNTogasSZenlrIG9yeWdpbmHFgnUNCm1hcmNfZmllbGRfMDQxIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMDQxKSU+JQ0KICBmaWx0ZXIoWDA0MSE9IiIpICU+JQ0KICBtdXRhdGUoWDA0MT1zdHJfcmVwbGFjZV9hbGwoWDA0MSwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMDQxIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgwNDEhPSIiKSAlPiUNCiAgbXV0YXRlKFgwNDE9c3RyX3JlbW92ZV9hbGwoWDA0MSwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMDQxLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDA0MSwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzA0MSlbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8wNDE8LWNiaW5kKG1hcmNfZmllbGRfMDQxLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMDQxJFgwNDEgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8wNDEkWDA0MSxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgc3ViZmllbGRfbGlzdF9jaGFyMiA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdCwiXFwkIiwiXFxcXCQiKQ0KICBzdHJpbmdfYSA8LSAiKF4pKC4qP1xcfCINCiAgc3RyaW5nX2IgPC0gc3ViZmllbGRfbGlzdF9jaGFyMltpXQ0KICBzdHJpbmdfYyA8LSAiKSguKj8pKFxcLHswLDF9KSgoXFx8XFwkKSguKil8JCkiDQogIHN0cmluZyA8LSBwYXN0ZShzdHJpbmdfYSxzdHJpbmdfYixzdHJpbmdfYyxzZXAgPSAiIikNCiAgbWFyY19maWVsZF8wNDFbLGkrM10gPC0gaWZlbHNlKGdyZXBsKHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0sbWFyY19maWVsZF8wNDEkWDA0MSksc3RyX3JlcGxhY2VfYWxsKGdzdWIoc3RyaW5nLCJcXDMiLG1hcmNfZmllbGRfMDQxJFgwNDEpLCJcXCR7Mn0uIiwgIn4iKSxOQSkNCn0NCnphX2plenlrX29yeWdpbmFsdSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzA0MSAlPiUgc2VsZWN0KFpBX1VXQUdJLFpBX0pFWllLX09SWUdJTkFMVSA9IGAkYWApLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBtdXRhdGUoWkFfSkVaWUtfT1JZR0lOQUxVID0gc3RyX3JlcGxhY2VfYWxsKFpBX0pFWllLX09SWUdJTkFMVSwiXFwkYSIsIiwiKSkgJT4lDQogIHVuaXF1ZSgpDQoNCiM2OiB3c3DDs8WCdHfDs3JjeQ0KQk5fd3Nwb2x0d29yY2EgPC0gZGF0YSAlPiUgDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1KSAlPiUgDQogIG11dGF0ZSh3c3BvbHR3b3JjYSA9IHN0cl9yZW1vdmUoc3RyX3JlbW92ZV9hbGwoYXMuY2hhcmFjdGVyKHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDUsIig/PD07ICkoLiopKD89JCkiKSksIlxcLiQiKSwiY2hhcmFjdGVyXFwoMFxcKSIpLA0KICAgICAgICAgd3Nwb2x0d29yY2EgPSBzdHJfcmVtb3ZlX2FsbCh3c3BvbHR3b3JjYSwiIGV0IGFsXFwuIikpDQoNCm1hcmNfZmllbGRfNzAwIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNzAwKSU+JQ0KICBmaWx0ZXIoWDcwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDcwMD1zdHJfcmVwbGFjZV9hbGwoWDcwMCwiKC4uXFwkYSkiLCJ8XFwxIiksDQogICAgICAgICBYNzAwPXN0cl9yZXBsYWNlX2FsbChYNzAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg3MDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDcwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDcwMD1zdHJfcmVtb3ZlX2FsbChYNzAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg3MDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkgJT4lDQogIGZpbHRlcihYNzAwIT0iIikNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYNzAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNzAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzcwMDwtY2JpbmQobWFyY19maWVsZF83MDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF83MDAkWDcwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzcwMCRYNzAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzcwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzcwMCRYNzAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF83MDAkWDcwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQptYXJjX2ZpZWxkXzcwMCA8LSBtYXJjX2ZpZWxkXzcwMCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLG9zb2JhID0gYCRhYCxmdW5rY2phID0gYCRlYCkgJT4lDQogIGZpbHRlcighaXMubmEoZnVua2NqYSkpICU+JQ0KICBtdXRhdGUob3NvYmEgPSBzdHJfcmVtb3ZlKG9zb2JhLCIoPzw9W2EtemHDocOgw6LDo8OkxIPEgcOlxIXDpmXDqcOow6rDq8SbxJPEl8SZacOtw6zDrsOvxKvEr2lvw7PDssO0w7XDtsWRw7jFk3XDusO5w7vDvMWxxavFr3nDvWPEh8SNw6dkxI/EkcSRZ8SjxJ9rxLdsxYLEvG7FhMOxxYjFhsWLcsWZc8WbxaHFn3PDn3TFpcWnw77Fo3rFvMW6xb5dKShcXC4kKSIpLA0KICAgICAgICAgb3NvYmEgPSBpZmVsc2UoIWdyZXBsKCIsIixvc29iYSkmc3RyX2NvdW50KG9zb2JhLCIgIik9PTEsc3RyX3JlcGxhY2Uob3NvYmEsIiAiLCIsICIpLGFzLmNoYXJhY3Rlcihvc29iYSkpLA0KICAgICAgICAgT1NfTkFaV0lTS08gPSBpZmVsc2UoZ3JlcGwoIiwiLG9zb2JhKSxzdHJfcmVwbGFjZV9hbGwob3NvYmEsIiguKj8pKCwgKSguKikiLCJcXDEiKSxhcy5jaGFyYWN0ZXIob3NvYmEpKSwNCiAgICAgICAgIE9TX0lNSUUgPSBpZmVsc2UoZ3JlcGwoIiwiLG9zb2JhKSxzdHJfcmVwbGFjZV9hbGwob3NvYmEsIiguKj8pKCwgKSguKikiLCJcXDMiKSwiKiIpLA0KICAgICAgICAgd3NfcHJvc3R5ID0gc3RyX3JlcGxhY2VfYWxsKHN0cl90b19sb3dlcihvc29iYSksICJcXFciLCAiIiksDQogICAgICAgICBmdV9wcm9zdGEgPSBzdHJfcmVwbGFjZV9hbGwoc3RyX3RvX2xvd2VyKGZ1bmtjamEpLCAiXFxXIiwgIiIpKQ0KDQpCTl93c3BvbHR3b3JjYSA8LSBCTl93c3BvbHR3b3JjYSAlPiUgDQogIGxlZnRfam9pbihtYXJjX2ZpZWxkXzcwMCxieT0iWkFfVVdBR0kiKQ0KDQp4IDwtIDE6bnJvdyhCTl93c3BvbHR3b3JjYSkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIEJOX3dzcG9sdHdvcmNhJGN6eV9uYXp3aXNrb1tpXSA8LSBncmVwbChCTl93c3BvbHR3b3JjYSRPU19OQVpXSVNLT1tpXSxCTl93c3BvbHR3b3JjYSR3c3BvbHR3b3JjYVtpXSkNCiAgQk5fd3Nwb2x0d29yY2EkY3p5X2ltaWVbaV0gPC0gZ3JlcGwoQk5fd3Nwb2x0d29yY2EkT1NfSU1JRVtpXSxCTl93c3BvbHR3b3JjYSR3c3BvbHR3b3JjYVtpXSkNCn0NCg0KaWYgKGdyZXBsKCIwfDEiLEJOX3dzcG9sdHdvcmNhJGN6eV9uYXp3aXNrb1sxXSkpIHsNCiAgQk5fd3Nwb2x0d29yY2EgPC0gQk5fd3Nwb2x0d29yY2EgJT4lIA0KICAgIGZpbHRlcihjenlfbmF6d2lza289PTF8Y3p5X2ltaWU9PTEpDQp9IGVsc2Ugew0KICBCTl93c3BvbHR3b3JjYSA8LSBCTl93c3BvbHR3b3JjYSAlPiUgDQogICAgZmlsdGVyKGN6eV9uYXp3aXNrbz09VFJVRXxjenlfaW1pZT09VFJVRSkNCn0NCg0KQk5fd3Nwb2x0d29yY2EgPC0gQk5fd3Nwb2x0d29yY2EgJT4lIA0KICBsZWZ0X2pvaW4oLixQQkxfd3Nwb2x0d29yY3kgJT4lIHNlbGVjdChPU19PU09CQV9JRCxPU19MSUNaQkFfWkFQSVNPVyxuYXp3YV9wcm9zdGEpLGJ5PWMoIndzX3Byb3N0eSI9Im5hendhX3Byb3N0YSIpKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSxPU19OQVpXSVNLTyxPU19JTUlFLC1PU19MSUNaQkFfWkFQSVNPVykNCkJOX3dzcG9sdHdvcmNhJGlkX2dydXB5IDwtIGN1bXN1bSghZHVwbGljYXRlZChCTl93c3BvbHR3b3JjYVsxOjRdKSkNCkJOX3dzcG9sdHdvcmNhIDwtIEJOX3dzcG9sdHdvcmNhWyFkdXBsaWNhdGVkKEJOX3dzcG9sdHdvcmNhJGlkX2dydXB5KSxdICU+JQ0KICBsZWZ0X2pvaW4oLixQQkxfZnVua2NqZSxieT1jKCJmdV9wcm9zdGEiPSJuYXp3YSIpKSAlPiUNCiAgbXV0YXRlKGZvX3N5bWJvbCA9IGlmZWxzZShmb19zeW1ib2w9PSJOVUxMIixOQSxhcy5jaGFyYWN0ZXIoZm9fc3ltYm9sKSksDQogICAgICAgICBaQV9BRE5PVEFDSkUgPSBOQSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxPU19OQVpXSVNLTyxPU19JTUlFLE9TX09TT0JBX0lELGZvX3N5bWJvbCxmb19uYXp3YSxmdW5rY2phKQ0KDQojNzogb3BpcyB3c3DDs8WCdHfDs3Jjw7N3DQp6YV9vcGlzX3dzcG9sdHdvcmNvdyA8LSBCTl93c3BvbHR3b3JjYSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGZ1bmtjamEsT1NfSU1JRSxPU19OQVpXSVNLTykgJT4lIA0KICB1bml0ZSgiemFfb3Bpc193c3BvbHR3b3Jjb3ciLGMoZnVua2NqYSxPU19JTUlFLE9TX05BWldJU0tPKSxzZXAgPSAiICIsbmEucm0gPSBUUlVFKSAlPiUgDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKHphX29waXNfd3Nwb2x0d29yY293ID0gcGFzdGUoemFfb3Bpc193c3BvbHR3b3Jjb3csY29sbGFwc2UgPSAiLiAiKSkgJT4lDQogIHVuZ3JvdXAoKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIHJpZ2h0X2pvaW4oLixkYXRhICU+JSBzZWxlY3QoWkFfVVdBR0kpLGJ5PSJaQV9VV0FHSSIpDQoNCiM4IHd5ZGFuaWUNCm1hcmNfZmllbGRfMjUwIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjUwKSU+JQ0KICBmaWx0ZXIoWDI1MCE9IiIpDQoNCmlmIChucm93KG1hcmNfZmllbGRfMjUwKSAhPSAwKXsNCm1hcmNfZmllbGRfMjUwIDwtIG1hcmNfZmllbGRfMjUwICU+JQ0KICBtdXRhdGUoWDI1MD1zdHJfcmVwbGFjZV9hbGwoWDI1MCwiKF58XFx8KSIsIn5cXDEiKSkgJT4lDQogIGNTcGxpdCguLCJYMjUwIixzZXAgPSAifiIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgZmlsdGVyKFgyNTAhPSIiKSAlPiUNCiAgbXV0YXRlKFgyNTA9c3RyX3JlbW92ZV9hbGwoWDI1MCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMjUwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKGRhdGEkWDI1MCwiXFwkLiIpDQpzdWJmaWVsZF9saXN0PC0gdW5pcXVlKHVubGlzdChzdWJmaWVsZF9saXN0KSkNCmVtcHR5X3RhYmxlPC0gZGF0YS5mcmFtZShtYXRyaXgobmNvbCA9IGxlbmd0aChzdWJmaWVsZF9saXN0KSxucm93ID0gbGVuZ3RocyhtYXJjX2ZpZWxkXzI1MClbMV0pKQ0KY29sbmFtZXMoZW1wdHlfdGFibGUpIDwtc3ViZmllbGRfbGlzdA0KbWFyY19maWVsZF8yNTA8LWNiaW5kKG1hcmNfZmllbGRfMjUwLGVtcHR5X3RhYmxlKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHBhc3RlKCIoIixzdWJmaWVsZF9saXN0LCIpIixzZXAgPSAiIikNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBzdHJfcmVwbGFjZV9hbGwoc3ViZmllbGRfbGlzdF9jaGFyLCJcXCQiLCJcXFxcJCIpDQoNCnggPC0gMTpsZW5ndGgoc3ViZmllbGRfbGlzdCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIG1hcmNfZmllbGRfMjUwJFgyNTAgPC0gc3RyX3JlcGxhY2UobWFyY19maWVsZF8yNTAkWDI1MCxzdWJmaWVsZF9saXN0X2NoYXJbaV0sInxcXDEiKQ0KfQ0KDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzI1MFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzI1MCRYMjUwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8yNTAkWDI1MCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KemFfd3lkYW5pZSA8LSBtYXJjX2ZpZWxkXzI1MCAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLCB3eWRhbmllID0gYCRhYCkgJT4lDQogIG11dGF0ZSh3eWRhbmllID0gc3RyX3JlbW92ZSh3eWRhbmllLCIgXFwvJCIpKSAlPiUNCiAgcmlnaHRfam9pbiguLGRhdGEgJT4lIHNlbGVjdChaQV9VV0FHSSksYnk9IlpBX1VXQUdJIikNCn0gZWxzZSB7DQogIHphX3d5ZGFuaWUgPC0gZGF0YS5mcmFtZShaQV9VV0FHSSA9ICIiLCBYMjUwID0gIiIsIGluZGljYXRvciA9ICIiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpICU+JSANCiAgICBtdXRhdGUoYCRhYCA9ICIiLA0KICAgICAgICAgICB3eWRhbmllID0gIiIpICU+JSANCiAgICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KfQ0KDQojOTogaW5zdHl0dWNqYSBzcHJhd2N6YQ0KbWFyY19maWVsZF8yNDUgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgyNDUpJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIn4iKSwNCiAgICAgICAgIFgyNDU9c3RyX3JlcGxhY2VfYWxsKFgyNDUsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDI0NSIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYMjQ1IT0iIikgJT4lDQogIG11dGF0ZShYMjQ1PXN0cl9yZW1vdmVfYWxsKFgyNDUsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDI0NSwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFgyNDUsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF8yNDUpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfMjQ1PC1jYmluZChtYXJjX2ZpZWxkXzI0NSxlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzI0NSRYMjQ1IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfMjQ1JFgyNDUsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfMjQ1WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfMjQ1JFgyNDUpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzI0NSRYMjQ1KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQoNCnphX2luc3R5dHVjamEgPC0gbWFyY19maWVsZF8yNDUgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYMjQ1Yz1gJGNgKSAlPiUNCiAgZmlsdGVyKCFpcy5uYShYMjQ1YykpICU+JQ0KICBtdXRhdGUoaW5zdHl0dWNqYSA9IGlmZWxzZShncmVwbCgiXFw7IixYMjQ1Yyksc3RyX3JlcGxhY2VfYWxsKFgyNDVjLCAiKC4qPykoXFw7KD8hLipcXDspKSggKSsoLio/JCkiLCJcXDQiKSwiIikpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93c3BvbHR3b3JjYSxieT0iWkFfVVdBR0kiKQ0KDQp4IDwtIDE6bGVuZ3Rocyh6YV9pbnN0eXR1Y2phWzFdKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgemFfaW5zdHl0dWNqYSRjenlfbmF6d2lza29baV0gPC0gZ3JlcGwoemFfaW5zdHl0dWNqYSRPU19OQVpXSVNLT1tpXSx6YV9pbnN0eXR1Y2phJFgyNDVjW2ldKQ0KICB6YV9pbnN0eXR1Y2phJGN6eV9pbWllW2ldIDwtIGdyZXBsKHphX2luc3R5dHVjamEkT1NfSU1JRVtpXSx6YV9pbnN0eXR1Y2phJFgyNDVjW2ldKQ0KfQ0KDQp6YV9pbnN0eXR1Y2phIDwtIHphX2luc3R5dHVjamEgJT4lDQogIGZpbHRlcihpcy5uYShjenlfbmF6d2lza28pJmlzLm5hKGN6eV9pbWllKSkgJT4lDQogIGZpbHRlcihpbnN0eXR1Y2phIT0iIikgJT4lDQogIGZpbHRlcighZ3JlcGwoIl5cXFtbYS16YcOhw6DDosOjw6TEg8SBw6XEhcOmZcOpw6jDqsOrxJvEk8SXxJlpw63DrMOuw6/Eq8SvaW/Ds8Oyw7TDtcO2xZHDuMWTdcO6w7nDu8O8xbHFq8WvecO9Y8SHxI3Dp2TEj8SRxJFnxKPEn2vEt2zFgsS8bsWEw7HFiMWGxYtyxZlzxZvFocWfc8OfdMWlxafDvsWjesW8xbrFvl18XlthLXphw6HDoMOiw6PDpMSDxIHDpcSFw6Zlw6nDqMOqw6vEm8STxJfEmWnDrcOsw67Dr8SrxK9pb8Ozw7LDtMO1w7bFkcO4xZN1w7rDucO7w7zFscWrxa95w71jxIfEjcOnZMSPxJHEkWfEo8Sfa8S3bMWCxLxuxYTDscWIxYbFi3LFmXPFm8WhxZ9zw590xaXFp8O+xaN6xbzFusW+XSIsaW5zdHl0dWNqYSkpICU+JQ0KICBtdXRhdGUoaW5zdHl0dWNqYSA9IHN0cl9yZW1vdmUoaW5zdHl0dWNqYSwiXFwuJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLGluc3R5dHVjamEpICU+JQ0KICByaWdodF9qb2luKC4sZGF0YSAlPiUgc2VsZWN0KFpBX1VXQUdJKSxieT0iWkFfVVdBR0kiKQ0KDQojMTA6IHd5ZGF3bmljdHdvDQpCTl93eWRhd25pY3R3byA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksIFgyNjApICU+JQ0KICBtdXRhdGUoWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJzXFwublxcLiIsICJiLncuIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJzXFwubFxcLiIsICJiLm0uIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCJTXFwubFxcLiIsICJiLm0uIiksIA0KICAgICAgICAgWDI2MCA9IHN0cl9yZW1vdmUoWDI2MCwiXlxcXFwrIiksIA0KICAgICAgICAgcm9rX3d5ZGFuaWEgPSBzdHJfZXh0cmFjdF9hbGwoWDI2MCwgIig/PD1cXCRjKS4qKD89XFwkZSl8KD88PVxcJGMpLioiKSwgDQogICAgICAgICBiZXpfcm9rdSA9IHN0cl9yZXBsYWNlX2FsbChYMjYwLCAiLlxcJGMuKiIsICIiKSwgDQogICAgICAgICBpbGVfd3lkYXduaWN0dyA9IHN0cl9jb3VudChiZXpfcm9rdSwgIlxcJGIiKSwNCiAgICAgICAgIGlsZV9taWVqc2MgPSBzdHJfY291bnQoYmV6X3Jva3UsICJcXCRhIiksDQogICAgICAgICBrb2xlam5vc2MgPSBzdHJfcmVwbGFjZV9hbGwoYXMuY2hhcmFjdGVyKHN0cl9leHRyYWN0X2FsbChiZXpfcm9rdSwgIlxcJC4iKSksICJbXmEtel0iLCAiIiksDQogICAgICAgICBiZXpfcm9rdSA9IHN0cl9yZXBsYWNlX2FsbChiZXpfcm9rdSwgIjtcXCRiIiwgIjokYiIpLA0KICAgICAgICAgd3lkYXdfcG9kemllbCA9IGlmZWxzZShpbGVfd3lkYXduaWN0dz5pbGVfbWllanNjfGtvbGVqbm9zYz09ImNhYWJiIiwgc3RyX3JlcGxhY2VfYWxsKGJlel9yb2t1LCAiKFxcJGEpKC4qPykoIDpcXCRiLio/KSggOlxcJGIpIiwgIlxcMVxcMlxcMyA7JGFcXDJcXDQiKSxiZXpfcm9rdSksDQogICAgICAgICB3eWRhd25pY3R3b190ZXN0ID0gc3RyX3JlcGxhY2VfYWxsKHd5ZGF3X3BvZHppZWwsICIoXFwkYikoLio/KSggO1xcJGEpIiwgIlxcMVxcMnxcXDMiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxyb2tfd3lkYW5pYSx3eWRhd25pY3R3b190ZXN0KSAlPiUNCiAgY1NwbGl0KC4sICJ3eWRhd25pY3R3b190ZXN0Iiwgc2VwID0gInwiLCBkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBtdXRhdGUod3lkYXduaWN0d28gPSBzdHJfZXh0cmFjdF9hbGwod3lkYXduaWN0d29fdGVzdCwgIig/PD1cXCRiKSguKikiKSwNCiAgICAgICAgIG1pZWpzY2Vfd3lkYW5pYSA9IHN0cl9yZXBsYWNlX2FsbChzdHJfZXh0cmFjdF9hbGwod3lkYXduaWN0d29fdGVzdCwgIig/PD1cXCRhKSguKikoPz0gezAsMX06IHswLDF9XFwkYil8KD88PVxcJGEpKC4qKSgkKSIpLCIgO1xcJGEiLCAiLCAiKSwNCiAgICAgICAgIG5hendhX3Byb3N0YSA9IHN0cl90b19sb3dlcihzdHJfcmVwbGFjZV9hbGwoc3RyX3JlcGxhY2VfYWxsKHVubGlzdCh3eWRhd25pY3R3b190ZXN0KSwgIlxcJFxcdyIsICIiKSwgIlxcVyIsICIiKSkpICU+JQ0KICBsZWZ0X2pvaW4oLixQQkxfd3lkYXduaWN0d2EsYnk9Im5hendhX3Byb3N0YSIpICU+JQ0KICBtdXRhdGUodG9fc2FtbyA9IHd5ZGF3bmljdHdvPT1XWV9OQVpXQSkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksLXRvX3NhbW8sLVdZX0xJQ1pCQV9aQVBJU09XKQ0KQk5fd3lkYXduaWN0d28kaWRfZ3J1cHkgPC0gY3Vtc3VtKCFkdXBsaWNhdGVkKEJOX3d5ZGF3bmljdHdvWzE6M10pKQ0KQk5fd3lkYXduaWN0d28gPC0gQk5fd3lkYXduaWN0d29bIWR1cGxpY2F0ZWQoQk5fd3lkYXduaWN0d28kaWRfZ3J1cHkpLF0gJT4lDQogIG11dGF0ZShXWV9OQVpXQSA9IGlmZWxzZSghaXMubmEoV1lfTkFaV0EpLGFzLmNoYXJhY3RlcihXWV9OQVpXQSksYXMuY2hhcmFjdGVyKHd5ZGF3bmljdHdvKSksDQogICAgICAgICBXWV9NSUFTVE8gPSBpZmVsc2UoIWlzLm5hKFdZX01JQVNUTyksYXMuY2hhcmFjdGVyKFdZX01JQVNUTyksdHJpbShhcy5jaGFyYWN0ZXIobWllanNjZV93eWRhbmlhKSkpLA0KICAgICAgICAgcm9rX3d5ZGFuaWEgPSBzdHJfcmVwbGFjZV9hbGwocm9rX3d5ZGFuaWEsICIoLiopKFxcLikiLCAiXFwxIiksDQogICAgICAgICB6YV9yb2tfd3lkYW5pYSA9IGlmZWxzZShuY2hhcihyb2tfd3lkYW5pYSk9PTQsYXMuY2hhcmFjdGVyKHJva193eWRhbmlhKSxOQSksDQogICAgICAgICBkb19vcGlzdSA9IGlmZWxzZShpcy5uYSh6YV9yb2tfd3lkYW5pYSkscGFzdGUoIlsiLHN0cl9leHRyYWN0KHJva193eWRhbmlhLCJcXGR7NH0iKSwiXSIsc2VwID0gIiIpLCIiKSwNCiAgICAgICAgIFdZX01JQVNUTyA9IGlmZWxzZShzdWJzdHIoV1lfTUlBU1RPLDEsMSk9PSJbIiZzdWJzdHIoV1lfTUlBU1RPLG5jaGFyKFdZX01JQVNUTyksbmNoYXIoV1lfTUlBU1RPKSkhPSJdIiZpcy5uYShXWV9XWURBV05JQ1RXT19JRCkscGFzdGUodHJpbShXWV9NSUFTVE8pLCJdIixzZXAgPSAiIiksYXMuY2hhcmFjdGVyKFdZX01JQVNUTykpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFdZX1dZREFXTklDVFdPX0lELFdZX05BWldBLFdZX01JQVNUTyx6YV9yb2tfd3lkYW5pYSxkb19vcGlzdSkgJT4lIA0KICBtdXRhdGUoV1lfTkFaV0EgPSBpZmVsc2Uoc3RyX2NvdW50KFdZX05BWldBLCAiXFxbIik+c3RyX2NvdW50KFdZX05BWldBLCAiXFxdIiksIHBhc3RlKFdZX05BWldBLCAiXSIsIHNlcCA9ICIiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfY291bnQoV1lfTkFaV0EsICJcXFsiKTxzdHJfY291bnQoV1lfTkFaV0EsICJcXF0iKSwgcGFzdGUoIlsiLCBXWV9OQVpXQSwgc2VwID0gIiIpLCBhcy5jaGFyYWN0ZXIoV1lfTkFaV0EpKSksDQogICAgICAgICBXWV9NSUFTVE8gPSBpZmVsc2Uoc3RyX2NvdW50KFdZX01JQVNUTywgIlxcWyIpPnN0cl9jb3VudChXWV9NSUFTVE8sICJcXF0iKSwgcGFzdGUoV1lfTUlBU1RPLCAiXSIsIHNlcCA9ICIiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzdHJfY291bnQoV1lfTUlBU1RPLCAiXFxbIik8c3RyX2NvdW50KFdZX01JQVNUTywgIlxcXSIpLCBwYXN0ZSgiWyIsIFdZX01JQVNUTywgc2VwID0gIiIpLCBhcy5jaGFyYWN0ZXIoV1lfTUlBU1RPKSkpKQ0KDQojMTE6IG9waXMgZml6eWN6bnkga3NpxIXFvGtpDQojcG9sZSAzMDAgZG8gb3Bpc3UgZml6eWN6bmVnbw0KbWFyY19maWVsZF8zMDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFgzMDApJT4lDQogIGZpbHRlcihYMzAwIT0iIikgJT4lDQogIG11dGF0ZShYMzAwPXN0cl9yZXBsYWNlX2FsbChYMzAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlgzMDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDMwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDMwMD1zdHJfcmVtb3ZlX2FsbChYMzAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFgzMDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYMzAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMzAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzMwMDwtY2JpbmQobWFyY19maWVsZF8zMDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8zMDAkWDMwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzMwMCRYMzAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzMwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzMwMCRYMzAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8zMDAkWDMwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQppZigiJGUiICVpbiUgY29sbmFtZXMobWFyY19maWVsZF8zMDApKSB7DQptYXJjX2ZpZWxkXzMwMCA8LSBtYXJjX2ZpZWxkXzMwMCAlPiUNCiAgbXV0YXRlKGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIiBcXDsrJHwgXFw6KyQiKSwNCiAgICAgICAgIGAkYmAgPSBzdHJfcmVtb3ZlKGAkYmAsIiBcXDsrJHwgXFw6KyQiKSwNCiAgICAgICAgIGAkZWAgPSBpZmVsc2UoZ3JlcGwoIkNELVJPTXxEVkR8VkNEfENEIixgJGVgKSZncmVwbCgiXFwrIGR5c2t8cMWCeXQiLGAkZWApLHN0cl9leHRyYWN0KGAkZWAsIig/PD1cXCspKGR5c2t8cMWCeXQuKj8pKENELVJPTXxEVkR8VkNEfENEKShcXCkpezAsMX0iKSwNCiAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGdyZXBsKCJDRC1ST018RFZEfFZDRHxDRCIsYCRlYCksc3RyX2V4dHJhY3QoYCRlYCwiKF4uKj8pKENELVJPTXxEVkR8VkNEfENEKShcXCkpezAsMX0iKSxOQSkpLA0KICAgICAgICAgYCRhYCA9IGlmZWxzZShpcy5uYShgJGFgKSwiIixhcy5jaGFyYWN0ZXIoYCRhYCkpLA0KICAgICAgICAgYCRiYCA9IGlmZWxzZShpcy5uYShgJGJgKSwiIixhcy5jaGFyYWN0ZXIoYCRiYCkpLA0KICAgICAgICAgYCRlYCA9IGlmZWxzZShpcy5uYShgJGVgKSwiIixhcy5jaGFyYWN0ZXIoYCRlYCkpKQ0KfSBlbHNlIHsNCiAgbWFyY19maWVsZF8zMDAgPC0gbWFyY19maWVsZF8zMDAgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlbW92ZShgJGFgLCIgXFw7KyR8IFxcOiskIiksDQogICAgICAgICBgJGJgID0gc3RyX3JlbW92ZShgJGJgLCIgXFw7KyR8IFxcOiskIiksDQogICAgICAgICBgJGFgID0gaWZlbHNlKGlzLm5hKGAkYWApLCIiLGFzLmNoYXJhY3RlcihgJGFgKSksDQogICAgICAgICBgJGJgID0gaWZlbHNlKGlzLm5hKGAkYmApLCIiLGFzLmNoYXJhY3RlcihgJGJgKSkpDQp9DQojcG9sZSA1MDAgZG8gb3Bpc3UgZml6eWN6bmVnbw0KbWFyY19maWVsZF81MDAgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLFg1MDApJT4lDQogIGZpbHRlcihYNTAwIT0iIikgJT4lDQogIG11dGF0ZShYNTAwPXN0cl9yZXBsYWNlX2FsbChYNTAwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg1MDAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDUwMCE9IiIpICU+JQ0KICBtdXRhdGUoWDUwMD1zdHJfcmVtb3ZlX2FsbChYNTAwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg1MDAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYNTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzUwMDwtY2JpbmQobWFyY19maWVsZF81MDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF81MDAkWDUwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzUwMCRYNTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzUwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzUwMCRYNTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF81MDAkWDUwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KbWFyY19maWVsZF81MDAgPC0gbWFyY19maWVsZF81MDAgJT4lDQogIG11dGF0ZShgJGFgID0gaWZlbHNlKGdyZXBsKCJvcnlnKFxcLnxcXCwpIixYNTAwKSZncmVwbCgicHNldWR8bmF6d2EiLFg1MDAsaWdub3JlLmNhc2UgPSBUUlVFKSxzdHJfcmVwbGFjZShgJGFgLCIoXi4qPykoXFwuICkoXFxwe0x1fS4qJCkiLCJcXDMiKSxhcy5jaGFyYWN0ZXIoYCRhYCkpKSAlPiUgDQogIGZpbHRlcighZ3JlcGwoIm9yeWcoXFwufFxcLCkiLGAkYWApJmdyZXBsKCJwc2V1ZHxuYXp3YXxkb3R5Y3p8cG9sIixgJGFgLGlnbm9yZS5jYXNlID0gVFJVRSkpICU+JQ0KICBtdXRhdGUoYCRhYCA9IHN0cl9yZW1vdmUoYCRhYCwiIFxcOyskfCBcXDorJCIpKQ0KICANCiNwb2xlIDU0NiBkbyBvcGlzdSBmaXp5Y3puZWdvDQptYXJjX2ZpZWxkXzU0NiA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDU0NiklPiUNCiAgZmlsdGVyKFg1NDYhPSIiKQ0KDQppZiAobnJvdyhtYXJjX2ZpZWxkXzU0NikgIT0gMCl7DQptYXJjX2ZpZWxkXzU0NiA8LSBtYXJjX2ZpZWxkXzU0NiAlPiUNCiAgbXV0YXRlKFg1NDY9c3RyX3JlcGxhY2VfYWxsKFg1NDYsIihefFxcfCkiLCJ+XFwxIikpICU+JQ0KICBjU3BsaXQoLiwiWDU0NiIsc2VwID0gIn4iLGRpcmVjdGlvbiA9ICJsb25nIikgJT4lDQogIGZpbHRlcihYNTQ2IT0iIikgJT4lDQogIG11dGF0ZShYNTQ2PXN0cl9yZW1vdmVfYWxsKFg1NDYsIl5cXHwiKSkgJT4lDQogIG11dGF0ZShpbmRpY2F0b3IgPSBzdHJfcmVwbGFjZV9hbGwoWDU0NiwiKF4uKj8pKFxcJC4qKSIsIlxcMSIpKQ0Kc3ViZmllbGRfbGlzdDwtIHN0cl9leHRyYWN0X2FsbChkYXRhJFg1NDYsIlxcJC4iKQ0Kc3ViZmllbGRfbGlzdDwtIHVuaXF1ZSh1bmxpc3Qoc3ViZmllbGRfbGlzdCkpDQplbXB0eV90YWJsZTwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSBsZW5ndGgoc3ViZmllbGRfbGlzdCksbnJvdyA9IGxlbmd0aHMobWFyY19maWVsZF81NDYpWzFdKSkNCmNvbG5hbWVzKGVtcHR5X3RhYmxlKSA8LXN1YmZpZWxkX2xpc3QNCm1hcmNfZmllbGRfNTQ2PC1jYmluZChtYXJjX2ZpZWxkXzU0NixlbXB0eV90YWJsZSkNCnN1YmZpZWxkX2xpc3RfY2hhciA8LSBwYXN0ZSgiKCIsc3ViZmllbGRfbGlzdCwiKSIsc2VwID0gIiIpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3RfY2hhciwiXFwkIiwiXFxcXCQiKQ0KDQp4IDwtIDE6bGVuZ3RoKHN1YmZpZWxkX2xpc3QpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBtYXJjX2ZpZWxkXzU0NiRYNTQ2IDwtIHN0cl9yZXBsYWNlKG1hcmNfZmllbGRfNTQ2JFg1NDYsc3ViZmllbGRfbGlzdF9jaGFyW2ldLCJ8XFwxIikNCn0NCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHN1YmZpZWxkX2xpc3RfY2hhcjIgPC0gc3RyX3JlcGxhY2VfYWxsKHN1YmZpZWxkX2xpc3QsIlxcJCIsIlxcXFwkIikNCiAgc3RyaW5nX2EgPC0gIiheKSguKj9cXHwiDQogIHN0cmluZ19iIDwtIHN1YmZpZWxkX2xpc3RfY2hhcjJbaV0NCiAgc3RyaW5nX2MgPC0gIikoLio/KShcXCx7MCwxfSkoKFxcfFxcJCkoLiopfCQpIg0KICBzdHJpbmcgPC0gcGFzdGUoc3RyaW5nX2Esc3RyaW5nX2Isc3RyaW5nX2Msc2VwID0gIiIpDQogIG1hcmNfZmllbGRfNTQ2WyxpKzNdIDwtIGlmZWxzZShncmVwbChzdWJmaWVsZF9saXN0X2NoYXIyW2ldLG1hcmNfZmllbGRfNTQ2JFg1NDYpLHN0cl9yZXBsYWNlX2FsbChnc3ViKHN0cmluZywiXFwzIixtYXJjX2ZpZWxkXzU0NiRYNTQ2KSwiXFwkezJ9LiIsICJ+IiksTkEpDQp9DQptYXJjX2ZpZWxkXzU0NiA8LSBtYXJjX2ZpZWxkXzU0NiAlPiUNCiAgbXV0YXRlKGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIiBcXDsrJHwgXFw6KyQiKSkNCn0gZWxzZSB7DQogIG1hcmNfZmllbGRfNTQ2IDwtIGRhdGEuZnJhbWUoWkFfVVdBR0kgPSAiIiwgWDU0NiA9ICIiLCBpbmRpY2F0b3IgPSAiIiwgc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKSAlPiUgDQogICAgbXV0YXRlKGAkYWAgPSAiIikNCn0NCg0KaWYoIiRlIiAlaW4lIGNvbG5hbWVzKG1hcmNfZmllbGRfMzAwKSkgew0KemFfb3Bpc19rcyA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl93eWRhd25pY3R3byAlPiUgc2VsZWN0KFpBX1VXQUdJLGRvX29waXN1KSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8zMDAgJT4lIHNlbGVjdChaQV9VV0FHSSxYMzAwYT1gJGFgLFgzMDBiPWAkYmAsWDMwMGU9YCRlYCksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfNTAwICU+JSBzZWxlY3QoWkFfVVdBR0ksWDUwMGE9YCRhYCksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfNTQ2ICU+JSBzZWxlY3QoWkFfVVdBR0ksWDU0NmE9YCRhYCksYnk9IlpBX1VXQUdJIikNCnphX29waXNfa3NbaXMubmEoemFfb3Bpc19rcyldICA8LSAiIg0KemFfb3Bpc19rcyA8LSB6YV9vcGlzX2tzICU+JQ0KICBtdXRhdGUoemFfb3Bpc19rcyA9IHBhc3RlKGlmZWxzZShkb19vcGlzdSE9IiIscGFzdGUoYXMuY2hhcmFjdGVyKGRvX29waXN1KSwiLCAiLHNlcCA9ICIiKSwiIiksaWZlbHNlKFgzMDBhIT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoWDMwMGEpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDMwMGIhPSIiLHBhc3RlKGFzLmNoYXJhY3RlcihYMzAwYiksIiwgIixzZXAgPSAiIiksIiIpLGlmZWxzZShYMzAwZSE9IiIscGFzdGUoYXMuY2hhcmFjdGVyKFgzMDBlKSwiLCAiLHNlcCA9ICIiKSwiIiksaWZlbHNlKFg1MDBhIT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoWDUwMGEpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDU0NmEhPSIiLGFzLmNoYXJhY3RlcihYNTQ2YSksIiIpLHNlcCA9ICIiKSwNCiAgICAgICAgIHphX29waXNfa3MgPSBzdHJfcmVtb3ZlKHphX29waXNfa3MsIigsICkrJCIpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLHphX29waXNfa3MpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSwtbmNoYXIoemFfb3Bpc19rcykpDQp9IGVsc2Ugew0KICB6YV9vcGlzX2tzIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLEJOX3d5ZGF3bmljdHdvICU+JSBzZWxlY3QoWkFfVVdBR0ksZG9fb3Bpc3UpLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixtYXJjX2ZpZWxkXzMwMCAlPiUgc2VsZWN0KFpBX1VXQUdJLFgzMDBhPWAkYWAsWDMwMGI9YCRiYCksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfNTAwICU+JSBzZWxlY3QoWkFfVVdBR0ksWDUwMGE9YCRhYCksYnk9IlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLG1hcmNfZmllbGRfNTQ2ICU+JSBzZWxlY3QoWkFfVVdBR0ksWDU0NmE9YCRhYCksYnk9IlpBX1VXQUdJIikNCnphX29waXNfa3NbaXMubmEoemFfb3Bpc19rcyldICA8LSAiIg0KemFfb3Bpc19rcyA8LSB6YV9vcGlzX2tzICU+JQ0KICBtdXRhdGUoemFfb3Bpc19rcyA9IHBhc3RlKGlmZWxzZShkb19vcGlzdSE9IiIscGFzdGUoYXMuY2hhcmFjdGVyKGRvX29waXN1KSwiLCAiLHNlcCA9ICIiKSwiIiksaWZlbHNlKFgzMDBhIT0iIixwYXN0ZShhcy5jaGFyYWN0ZXIoWDMwMGEpLCIsICIsc2VwID0gIiIpLCIiKSxpZmVsc2UoWDMwMGIhPSIiLHBhc3RlKGFzLmNoYXJhY3RlcihYMzAwYiksIiwgIixzZXAgPSAiIiksIiIpLGlmZWxzZShYNTAwYSE9IiIscGFzdGUoYXMuY2hhcmFjdGVyKFg1MDBhKSwiLCAiLHNlcCA9ICIiKSwiIiksaWZlbHNlKFg1NDZhIT0iIixhcy5jaGFyYWN0ZXIoWDU0NmEpLCIiKSxzZXAgPSAiIiksDQogICAgICAgICB6YV9vcGlzX2tzID0gc3RyX3JlbW92ZSh6YV9vcGlzX2tzLCIoLCApKyQiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSx6YV9vcGlzX2tzKSAlPiUNCiAgdW5pcXVlKCkgJT4lDQogIGFycmFuZ2UoWkFfVVdBR0ksLW5jaGFyKHphX29waXNfa3MpKQ0KfQ0KemFfb3Bpc19rcyRpZF9ncnVweSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQoemFfb3Bpc19rc1sxXSkpDQp6YV9vcGlzX2tzIDwtIHphX29waXNfa3NbIWR1cGxpY2F0ZWQoemFfb3Bpc19rcyRpZF9ncnVweSksXSAlPiUNCiAgc2VsZWN0KC1pZF9ncnVweSkNCg0Kd3NwX2luZm8gPC0gemFfb3Bpc19rcyAlPiUgDQogIGxlZnRfam9pbih0eXR1bF93c3BvbHd5ZGFuaWUsYnk9IlpBX1VXQUdJIikgJT4lIA0KICBsZWZ0X2pvaW4oQk5fYXV0b3IsYnk9IlpBX1VXQUdJIikgJT4lIA0KICBtdXRhdGUod3NwID0gcGFzdGUoIltXc3DDs8WCd3lkLjogIixpZmVsc2UoQU1fSU1JRT09IioiLCIiLEFNX0lNSUUpLCIgIixBTV9OQVpXSVNLTywiOiAiLFpBX1RZVFVMLCJdIiwgc2VwID0gIiIpLA0KICAgICAgICAgemFfdXdhZ2kyID0gc3RyX3JlbW92ZV9hbGwoWkFfVVdBR0ksIi4kIikpDQoNCndzcF9pbmZvICUkJSAgDQogICAgeyB6YV91d2FnaTIgPT0gZHBseXI6OmxhZyh6YV91d2FnaTIsIDEpfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gd3NwX2luZm8kc2FtZQ0Kd3NwX2luZm8kc2FtZVsxXSA8LSAwDQoNCndzcF9pbmZvIDwtIHdzcF9pbmZvICU+JSANCiAgYXJyYW5nZSh6YV91d2FnaTIsLXNhbWUpDQoNCnphX29waXNfa3MgPC0gemFfb3Bpc19rcyAlPiUgDQogIGJpbmRfY29scyh3c3BfaW5mbyAlPiUgc2VsZWN0KHdzcCkpICU+JSANCiAgdW5pdGUoInphX29waXNfa3MiLHphX29waXNfa3M6d3NwLHJlbW92ZSA9IFRSVUUsc2VwID0gIiAiKQ0KDQojMTI6IHNlcmlhIHd5ZGF3bmljemENCm1hcmNfZmllbGRfNDkwIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxYNDkwLFg4MDAsWDgzMCkgJT4lDQogIG11dGF0ZShYNDkwID0gaWZlbHNlKGdyZXBsKCJVXFwrIixYNDkwKSxhcy5jaGFyYWN0ZXIoWDgzMCksYXMuY2hhcmFjdGVyKFg0OTApKSkgJT4lDQogIG11dGF0ZShYODAwID0gaWZlbHNlKFg0OTAhPSIiLCIiLGFzLmNoYXJhY3RlcihYODAwKSksDQogICAgICAgICBYODMwID0gaWZlbHNlKFg0OTAhPSIiLCIiLGFzLmNoYXJhY3RlcihYODMwKSksDQogICAgICAgICBYODAwID0gc3RyX3JlcGxhY2UoWDgwMCwiKFxcJGEpKC4qKShcXCR0KSIsIlxcMSIpLA0KICAgICAgICAgWDQ5MCA9IGlmZWxzZShYNDkwPT0iIiZYODMwIT0iIixhcy5jaGFyYWN0ZXIoWDgzMCksDQogICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShYNDkwPT0iIiZYODAwIT0iIixhcy5jaGFyYWN0ZXIoWDgwMCksYXMuY2hhcmFjdGVyKFg0OTApKSkpICU+JQ0KICBzZWxlY3QoWkFfVVdBR0ksWDQ5MCkgJT4lDQogIGZpbHRlcihYNDkwIT0iIikgJT4lDQogIG11dGF0ZShYNDkwPXN0cl9yZXBsYWNlX2FsbChYNDkwLCIoXnxcXHwpIiwiflxcMSIpKSAlPiUNCiAgY1NwbGl0KC4sIlg0OTAiLHNlcCA9ICJ+IixkaXJlY3Rpb24gPSAibG9uZyIpICU+JQ0KICBmaWx0ZXIoWDQ5MCE9IiIpICU+JQ0KICBtdXRhdGUoWDQ5MD1zdHJfcmVtb3ZlX2FsbChYNDkwLCJeXFx8IikpICU+JQ0KICBtdXRhdGUoaW5kaWNhdG9yID0gc3RyX3JlcGxhY2VfYWxsKFg0OTAsIiheLio/KShcXCQuKikiLCJcXDEiKSkNCnN1YmZpZWxkX2xpc3Q8LSBzdHJfZXh0cmFjdF9hbGwoZGF0YSRYNDkwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfNDkwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzQ5MDwtY2JpbmQobWFyY19maWVsZF80OTAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF80OTAkWDQ5MCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzQ5MCRYNDkwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzQ5MFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzQ5MCRYNDkwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF80OTAkWDQ5MCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQppZiAoIiR2IiAlaW4lIGNvbG5hbWVzKG1hcmNfZmllbGRfNDkwKSl7DQp6YV9zZXJpYV93eWRhd25pY3phIDwtIG1hcmNfZmllbGRfNDkwICU+JQ0KICBtdXRhdGUoYCRhYCA9IHN0cl9yZXBsYWNlX2FsbChgJGFgLCIoPSkoXFwkYSkiLCJcXDEgIiksDQogICAgICAgICBgJGFgID0gc3RyX3JlbW92ZShgJGFgLCIgXFw7KyR8IFxcOiskIiksDQogICAgICAgICBgJHZgID0gaWZlbHNlKGlzLm5hKGAkdmApLCIiLGFzLmNoYXJhY3RlcihgJHZgKSkpICU+JQ0KICBmaWx0ZXIoIWlzLm5hKGAkYWApKSAlPiUNCiAgbXV0YXRlKHNlcmlhID0gc3RyX3JlbW92ZShwYXN0ZSgiKCIsYCRhYCwiOyAiLGAkdmAsIikiLHNlcCA9ICIiKSwiOyAoPz1cXCkkKSIpLA0KICAgICAgICAgc2VyaWEgPSBnc3ViKCIoIDogKSguKSIsIi4gXFxVXFwyIixwZXJsPVRSVUUsc2VyaWEpKSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJLHNlcmlhKSAlPiUNCiAgZ3JvdXBfYnkoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoc2VyaWEgPSBwYXN0ZShzZXJpYSxjb2xsYXBzZSA9ICIgIikpICU+JQ0KICB1bmdyb3VwKCkgJT4lDQogIHVuaXF1ZSgpICU+JQ0KICBtdXRhdGUoc2VyaWEgPSBzdHJfcmVwbGFjZV9hbGwoc2VyaWEsIlxcJC4iLCI7ICIpKSAlPiUNCiAgcmlnaHRfam9pbiguLGRhdGEgJT4lIHNlbGVjdChaQV9VV0FHSSksYnk9IlpBX1VXQUdJIikNCn0gZWxzZSB7DQogIHphX3NlcmlhX3d5ZGF3bmljemEgPC0gbWFyY19maWVsZF80OTAgJT4lDQogIG11dGF0ZShgJGFgID0gc3RyX3JlcGxhY2VfYWxsKGAkYWAsIig9KShcXCRhKSIsIlxcMSAiKSwNCiAgICAgICAgIGAkYWAgPSBzdHJfcmVtb3ZlKGAkYWAsIiBcXDsrJHwgXFw6KyQiKSkgJT4lDQogIGZpbHRlcighaXMubmEoYCRhYCkpICU+JQ0KICBtdXRhdGUoc2VyaWEgPSBzdHJfcmVtb3ZlKHBhc3RlKCIoIixgJGFgLCIpIixzZXAgPSAiIiksIjsgKD89XFwpJCkiKSwNCiAgICAgICAgIHNlcmlhID0gZ3N1YigiKCA6ICkoLikiLCIuIFxcVVxcMiIscGVybD1UUlVFLHNlcmlhKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxzZXJpYSkgJT4lDQogIGdyb3VwX2J5KFpBX1VXQUdJKSAlPiUNCiAgbXV0YXRlKHNlcmlhID0gcGFzdGUoc2VyaWEsY29sbGFwc2UgPSAiICIpKSAlPiUNCiAgdW5ncm91cCgpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgbXV0YXRlKHNlcmlhID0gc3RyX3JlcGxhY2VfYWxsKHNlcmlhLCJcXCQuIiwiOyAiKSkgJT4lDQogIHJpZ2h0X2pvaW4oLixkYXRhICU+JSBzZWxlY3QoWkFfVVdBR0kpLGJ5PSJaQV9VV0FHSSIpDQp9DQoNCiMxMzogdG9teQ0KemFfdG9teSA8LSBkYXRhICU+JQ0KICBzZWxlY3QoWkFfVVdBR0kpICU+JQ0KICBtdXRhdGUoemFfdG9teSA9IE5BKQ0KDQojMTQ6IGFkbm90YWNqZQ0KemFfYWRub3RhY2plIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLEJOX2F1dG9yICU+JSBzZWxlY3QoWkFfVVdBR0ksWkFfQUROT1RBQ0pFKSxieT0iWkFfVVdBR0kiKSAlPiUNCiAgbXV0YXRlKFpBX0FETk9UQUNKRSA9IGlmZWxzZShpcy5uYShaQV9BRE5PVEFDSkUpLCIiLHBhc3RlKGFzLmNoYXJhY3RlcihaQV9BRE5PVEFDSkUpLCIjICIsc2VwID0gIiIpKSwNCiAgICAgICAgIFpBX0FETk9UQUNKRSA9IHN0cl9yZW1vdmUoWkFfQUROT1RBQ0pFLCIoIyApKyQiKSkgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxaQV9BRE5PVEFDSkUpICU+JQ0KICB1bmlxdWUoKSAlPiUNCiAgYXJyYW5nZShaQV9VV0FHSSwtbmNoYXIoWkFfQUROT1RBQ0pFKSkNCnphX2Fkbm90YWNqZSRpZF9ncnVweSA8LSBjdW1zdW0oIWR1cGxpY2F0ZWQoemFfYWRub3RhY2plWzFdKSkNCnphX2Fkbm90YWNqZSA8LSB6YV9hZG5vdGFjamVbIWR1cGxpY2F0ZWQoemFfYWRub3RhY2plJGlkX2dydXB5KSxdICU+JQ0KICBzZWxlY3QoLWlkX2dydXB5KQ0KDQojMTU6IEJOX1VSTA0KQk5fVVJMIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSxCTl9VUkwpDQoNCiN3eXLDs3duYW5pZSBsaWN6Ynkgd2llcnN6eSBkbyBsaWN6Ynkgd2llcnN6eSBvYmlla3R1IGRhdGENCkJOX2F1dG9yIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLEJOX2F1dG9yICU+JSBzZWxlY3QoWkFfVVdBR0ksQU1fQVVUT1JfSUQsQU1fTkFaV0lTS08sQU1fSU1JRSksYnk9IlpBX1VXQUdJIikgJT4lDQogIGRkcGx5KC4sIC4oWkFfVVdBR0kpLCBzdW1tYXJpemUsIEFNX0FVVE9SX0lEID0gcGFzdGUoQU1fQVVUT1JfSUQsIGNvbGxhcHNlPSJ8IiksIEFNX05BWldJU0tPID0gcGFzdGUoQU1fTkFaV0lTS08sIGNvbGxhcHNlPSJ8IiksIEFNX0lNSUUgPSBwYXN0ZShBTV9JTUlFLCBjb2xsYXBzZT0ifCIpKQ0KQk5fd3Nwb2x0d29yY2EgPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3Nwb2x0d29yY2EgJT4lIHNlbGVjdChaQV9VV0FHSSxPU19PU09CQV9JRCxPU19OQVpXSVNLTyxPU19JTUlFLGZvX3N5bWJvbCksYnk9IlpBX1VXQUdJIikgJT4lDQogIGRkcGx5KC4sIC4oWkFfVVdBR0kpLCBzdW1tYXJpemUsIE9TX09TT0JBX0lEID0gcGFzdGUoT1NfT1NPQkFfSUQsIGNvbGxhcHNlPSJ8IiksIE9TX05BWldJU0tPID0gcGFzdGUoT1NfTkFaV0lTS08sIGNvbGxhcHNlPSJ8IiksIE9TX0lNSUUgPSBwYXN0ZShPU19JTUlFLCBjb2xsYXBzZT0ifCIpLCBmb19zeW1ib2wgPSBwYXN0ZShmb19zeW1ib2wsIGNvbGxhcHNlPSJ8IikpICU+JQ0KICBtdXRhdGUoZm9fc3ltYm9sID0gaWZlbHNlKGZvX3N5bWJvbD09Ik5VTEwiLCJOQSIsYXMuY2hhcmFjdGVyKGZvX3N5bWJvbCkpKQ0KQk5fd3lkYXduaWN0d28gPC0gZGF0YSAlPiUNCiAgc2VsZWN0KFpBX1VXQUdJKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3lkYXduaWN0d28gJT4lIHNlbGVjdChaQV9VV0FHSSxXWV9XWURBV05JQ1RXT19JRCxXWV9OQVpXQSxXWV9NSUFTVE8semFfcm9rX3d5ZGFuaWEpLGJ5PSJaQV9VV0FHSSIpICU+JQ0KICBkZHBseSguLCAuKFpBX1VXQUdJKSwgc3VtbWFyaXplLCBXWV9XWURBV05JQ1RXT19JRCA9IHBhc3RlKFdZX1dZREFXTklDVFdPX0lELCBjb2xsYXBzZT0ifCIpLCBXWV9OQVpXQSA9IHBhc3RlKFdZX05BWldBLCBjb2xsYXBzZT0ifCIpLCBXWV9NSUFTVE8gPSBwYXN0ZShXWV9NSUFTVE8sIGNvbGxhcHNlPSJ8IiksIHphX3Jva193eWRhbmlhID0gcGFzdGUodW5pcXVlKHphX3Jva193eWRhbmlhKSwgY29sbGFwc2U9InwiKSkgJT4lDQogIG11dGF0ZSh6YV9yb2tfd3lkYW5pYSA9IGlmZWxzZSh6YV9yb2tfd3lkYW5pYT09Ik5BIiwiIixhcy5pbnRlZ2VyKHphX3Jva193eWRhbmlhKSkpDQoNCiNwb8WCxIVjemVuaWUgd3N6eXN0a2ljaCBlbGVtZW50w7N3IHcgamVkbsSFIHRhYmVsxJkNCmtvbGVqbm9zYyA8LSBkYXRhLmZyYW1lKGtvbGVqbm9zYz1jKCJaQV9VV0FHSSIsIlJaX05BWldBIiwiWkFfUk9fUk9LIiwiWkFfVFlQRSIsIlJaX1JPRFpBSl9JRCIsIkRaX05BWldBIiwiRFpfRFpJQUxfSUQiLCJUV19UV09SQ0FfSUQiLCJBTV9BVVRPUl9JRCIsIkFNX05BWldJU0tPIiwiQU1fSU1JRSIsIlpBX1RZVFVMIiwiWkFfVFlUVUxfT1JZR0lOQUxVIiwiWkFfSkVaWUtfT1JZR0lOQUxVIiwiT1NfT1NPQkFfSUQiLCJPU19OQVpXSVNLTyIsIk9TX0lNSUUiLCJmb19zeW1ib2wiLCJ6YV9vcGlzX3dzcG9sdHdvcmNvdyIsInd5ZGFuaWUiLCJ6YV90b215IiwiaW5zdHl0dWNqYSIsIldZX1dZREFXTklDVFdPX0lEIiwiV1lfTUlBU1RPIiwiV1lfTkFaV0EiLCJ6YV9yb2tfd3lkYW5pYSIsInphX29waXNfa3MiLCJzZXJpYSIsIlRXX05BWldJU0tPIiwiVFdfSU1JRSIsInJlZGFrdG9yX2R6aWFsdSIsIlpBX0FETk9UQUNKRSIsIkJOX1VSTCIpKQ0KcG9sYWN6b25lIDwtIGRhdGEgJT4lDQogIHNlbGVjdChaQV9VV0FHSSkgJT4lDQogIGxlZnRfam9pbiguLHBvbGFfcGJsLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLEJOX2F1dG9yLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX3R5dHVsLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX3R5dHVsX29yeWdpbmFsdSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9qZXp5a19vcnlnaW5hbHUsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4sQk5fd3Nwb2x0d29yY2EsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfb3Bpc193c3BvbHR3b3Jjb3csYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfd3lkYW5pZSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV9pbnN0eXR1Y2phLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLEJOX3d5ZGF3bmljdHdvLGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX29waXNfa3MsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgbGVmdF9qb2luKC4semFfc2VyaWFfd3lkYXduaWN6YSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLix6YV90b215LGJ5ID0gIlpBX1VXQUdJIikgJT4lDQogIGxlZnRfam9pbiguLHphX2Fkbm90YWNqZSxieSA9ICJaQV9VV0FHSSIpICU+JQ0KICBsZWZ0X2pvaW4oLixCTl9VUkwsYnkgPSAiWkFfVVdBR0kiKSAlPiUNCiAgc2VsZWN0KGFzLnZlY3Rvcihrb2xlam5vc2Mka29sZWpub3NjKSkNCmNvbG5hbWVzKHBvbGFjem9uZSkgPC0gYygicmVrb3JkX0JOIiwicnpfbmF6d2EiLCJ6YV9yb19yb2siLCJ6YV90eXBlIiwicnpfcm9kemFqX2lkIiwiRFpfTkFaV0EiLCJEWl9EWklBTF9JRCIsInR3X3R3b3JjYV9pZCIsImFtX2F1dG9yX2lkIiwiYW1fbmF6d2lza28iLCJhbV9pbWllIiwiemFfdHl0dWwiLCJ6YV90eXR1bF9vcnlnaW5hbHUiLCJ6YV9qZXp5a19vcnlnaW5hbHUiLCJvc19vc29iYV9pZCIsIm9zX25hendpc2tvIiwib3NfaW1pZSIsImZvX3N5bWJvbCIsInphX29waXNfd3Nwb2x0d29yY293IiwiemFfd3lkYW5pZSIsInphX3RvbXkiLCJ6YV9pbnN0eXR1Y2phIiwid3lfd3lkYXduaWN0d29faWQiLCJ3eV9taWVqc2NlIiwid3lfbmF6d2EiLCJ6YV9yb2tfd3lkYW5pYSIsInphX29waXNfZml6eWN6bnlfa3NpYXpraSIsInphX3NlcmlhX3d5ZGF3bmljemEiLCJ0d19uYXp3aXNrbyIsInR3X2ltaWUiLCJwcmFjb3duaWsiLCJ6YV9hZG5vdGFjamUiLCJCTl9VUkwiKQ0KDQojemFzeWduYWxpem93YW5pZSBuaWVwb3ByYXduZWdvIGtvZG93YW5pYQ0KeCA8LSAxOihsZW5ndGgocG9sYWN6b25lKS0yKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICBwb2xhY3pvbmUkemFfYWRub3RhY2plIDwtIGlmZWxzZShncmVwbCgiPFVcXCsoLi4uLik+Iixwb2xhY3pvbmVbLGldKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG5jaGFyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpIT0wLHBhc3RlKHBvbGFjem9uZSR6YV9hZG5vdGFjamUscGFzdGUoIlVXQUdBISBCxYLEhWQga29kb3dhbmlhIHcgcG9sdSAiLGFzLmNoYXJhY3RlcihuYW1lcyhwb2xhY3pvbmVbaV0pKSwiIFpuYWpkxbogZnJhesSZIFwiPz8/XCIgaSB6cmVkYWd1aiBwb2xlLiIsc2VwID0gIiIpLHNlcCA9ICIjICIpLHBhc3RlKCJVV0FHQSEgQsWCxIVkIGtvZG93YW5pYSB3IHBvbHUgIixhcy5jaGFyYWN0ZXIobmFtZXMocG9sYWN6b25lW2ldKSksIiBabmFqZMW6IGZyYXrEmSBcIj8/P1wiIGkgenJlZGFndWogcG9sZS4iLHNlcCA9ICIiKSksYXMuY2hhcmFjdGVyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpKQ0KICBwb2xhY3pvbmVbLGldIDwtIGdzdWIoIjxVXFwrKC4uLi4pPiIsICI/Pz8iLCBwb2xhY3pvbmVbLGldKQ0KfQ0KI3phc3lnbmFsaXpvd2FuaWUgb2JlY25vxZtjaSB6bmFrdSAkIHcga3TDs3J5bcWbIHogcMOzbA0KWCA8LSAxOihsZW5ndGgocG9sYWN6b25lKS0yKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICBwb2xhY3pvbmUkemFfYWRub3RhY2plIDwtIGlmZWxzZShncmVwbCgiXFwkIixwb2xhY3pvbmVbLGldKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG5jaGFyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpPT0wLHBhc3RlKCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEgYsWCxJlkbnkgemFwaXMgQk4gdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgd3lkcnVrb3dhbm8gem5hayBcIiRcIi4gWnJlZGFndWogdHJlxZvEhyBwb2xhLiIsc2VwID0gIiIpLHBhc3RlKHBvbGFjem9uZSR6YV9hZG5vdGFjamUscGFzdGUoIlVXQUdBISBaZSB3emdsxJlkdSBuYSBixYLEmWRueSB6YXBpcyBCTiB3IHBvbHUgIixhcy5jaGFyYWN0ZXIobmFtZXMocG9sYWN6b25lW2ldKSksIiB3eWRydWtvd2FubyB6bmFrIFwiJFwiLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIiksc2VwID0gIiMgIikpLGFzLmNoYXJhY3Rlcihwb2xhY3pvbmUkemFfYWRub3RhY2plKSkNCn0NCiN6YXN5Z25hbGl6b3dhbmllIG9iZWNub8WbY2kgZnJhenkgImNoYXJhY3RlcigwKSIgdyBrdMOzcnltxZsgeiBww7NsDQpYIDwtIDE6KGxlbmd0aChwb2xhY3pvbmUpLTIpDQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpDQogIHBvbGFjem9uZSR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGdyZXBsKCJjaGFyYWN0ZXJcXCgwXFwpIixwb2xhY3pvbmVbLGldKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG5jaGFyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpPT0wLHBhc3RlKCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEgYsWCxJlkbnkgemFwaXMgQk4gdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgd3lkcnVrb3dhbm8gZnJhesSZIFwiY2hhcmFjdGVyKDApXCIuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxwYXN0ZShwb2xhY3pvbmUkemFfYWRub3RhY2plLHBhc3RlKCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEgYsWCxJlkbnkgemFwaXMgQk4gdyBwb2x1ICIsYXMuY2hhcmFjdGVyKG5hbWVzKHBvbGFjem9uZVtpXSkpLCIgd3lkcnVrb3dhbm8gZnJhesSZIFwiY2hhcmFjdGVyKDApXCIuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxzZXAgPSAiIyAiKSksYXMuY2hhcmFjdGVyKHBvbGFjem9uZSR6YV9hZG5vdGFjamUpKQ0KfQ0KI3phc3lnbmFsaXpvd2FuaWUgb2JlY25vxZtjaSB6bmFrdSAjIHcgb3Bpc2llIHdzcMOzxYJ0d8OzcmPDs3cNCnBvbGFjem9uZSR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGdyZXBsKCJcXCMiLHBvbGFjem9uZSR6YV9vcGlzX3dzcG9sdHdvcmNvdyksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShuY2hhcihwb2xhY3pvbmUkemFfYWRub3RhY2plKT09MCwiVVdBR0EhIFplIHd6Z2zEmWR1IG5hIGtvbmZsaWt0IHcgb3Bpc2llIHdzcMOzxYJ0d8OzcmPDs3cgd3liaWVyeiB3xYJhxZtjaXfEhSB3YXJ0b8WbxIcgKHN0cmVmYSBvZHBvd2llZHppYWxub8WbY2kgXCIjXCIgd3Nww7PFgnR3w7NyY3kgeiBwb2xhIDcwMCkuIixwYXN0ZShwb2xhY3pvbmUkemFfYWRub3RhY2plLCJVV0FHQSEgWmUgd3pnbMSZZHUgbmEga29uZmxpa3QgdyBvcGlzaWUgd3Nww7PFgnR3w7NyY8OzdyB3eWJpZXJ6IHfFgmHFm2Npd8SFIHdhcnRvxZvEhyAoc3RyZWZhIG9kcG93aWVkemlhbG5vxZtjaSAjIHdzcMOzxYJ0d8OzcmN5IHogcG9sYSA3MDApLiIsc2VwID0gIiMgIikpLGFzLmNoYXJhY3Rlcihwb2xhY3pvbmUkemFfYWRub3RhY2plKSkNCg0Kb3V0IDwtIGNTcGxpdChwb2xhY3pvbmUsIGMoImFtX2F1dG9yX2lkIiwgImFtX25hendpc2tvIiwgImFtX2ltaWUiLCJvc19vc29iYV9pZCIsIm9zX25hendpc2tvIiwgIm9zX2ltaWUiLCAiZm9fc3ltYm9sIiwid3lfd3lkYXduaWN0d29faWQiLCJ3eV9taWVqc2NlIiwid3lfbmF6d2EiKSxzZXAgPSAifCIsZGlyZWN0aW9uID0gImxvbmciKSAlPiUNCiAgdW5pcXVlKCkNCg0Kb3V0JHJla29yZF9CTiA8LSBpZmVsc2UoaXMubmEob3V0JHJla29yZF9CTiksJycsYXMuY2hhcmFjdGVyKG91dCRyZWtvcmRfQk4pKQ0Kb3V0JHJ6X25hendhIDwtIGlmZWxzZShpcy5uYShvdXQkcnpfbmF6d2EpLCcnLGFzLmNoYXJhY3RlcihvdXQkcnpfbmF6d2EpKQ0Kb3V0JHphX3JvX3JvayA8LSBpZmVsc2UoaXMubmEob3V0JHphX3JvX3JvayksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9yb19yb2spKQ0Kb3V0JHphX3R5cGUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV90eXBlKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3R5cGUpKQ0Kb3V0JHJ6X3JvZHphal9pZCA8LSBpZmVsc2UoaXMubmEob3V0JHJ6X3JvZHphal9pZCksJycsYXMuY2hhcmFjdGVyKG91dCRyel9yb2R6YWpfaWQpKQ0Kb3V0JERaX05BWldBIDwtIGlmZWxzZShpcy5uYShvdXQkRFpfTkFaV0EpLCcnLGFzLmNoYXJhY3RlcihvdXQkRFpfTkFaV0EpKQ0Kb3V0JERaX0RaSUFMX0lEIDwtIGlmZWxzZShpcy5uYShvdXQkRFpfRFpJQUxfSUQpLCcnLGFzLmNoYXJhY3RlcihvdXQkRFpfRFpJQUxfSUQpKQ0Kb3V0JHR3X3R3b3JjYV9pZCA8LSBpZmVsc2UoaXMubmEob3V0JHR3X3R3b3JjYV9pZCksJycsYXMuY2hhcmFjdGVyKG91dCR0d190d29yY2FfaWQpKQ0Kb3V0JGFtX2F1dG9yX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkYW1fYXV0b3JfaWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkYW1fYXV0b3JfaWQpKQ0Kb3V0JGFtX25hendpc2tvIDwtIGlmZWxzZShpcy5uYShvdXQkYW1fbmF6d2lza28pLCcnLGFzLmNoYXJhY3RlcihvdXQkYW1fbmF6d2lza28pKQ0Kb3V0JGFtX2ltaWUgPC0gaWZlbHNlKGlzLm5hKG91dCRhbV9pbWllKSwnJyxhcy5jaGFyYWN0ZXIob3V0JGFtX2ltaWUpKQ0Kb3V0JHphX3R5dHVsIDwtIGlmZWxzZShpcy5uYShvdXQkemFfdHl0dWwpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfdHl0dWwpKQ0Kb3V0JHphX3R5dHVsX29yeWdpbmFsdSA8LSBpZmVsc2UoaXMubmEob3V0JHphX3R5dHVsX29yeWdpbmFsdSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV90eXR1bF9vcnlnaW5hbHUpKQ0Kb3V0JHphX2plenlrX29yeWdpbmFsdSA8LSBpZmVsc2UoaXMubmEob3V0JHphX2plenlrX29yeWdpbmFsdSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9qZXp5a19vcnlnaW5hbHUpKQ0Kb3V0JG9zX29zb2JhX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkb3Nfb3NvYmFfaWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkb3Nfb3NvYmFfaWQpKQ0Kb3V0JG9zX25hendpc2tvIDwtIGlmZWxzZShpcy5uYShvdXQkb3NfbmF6d2lza28pLCcnLGFzLmNoYXJhY3RlcihvdXQkb3NfbmF6d2lza28pKQ0Kb3V0JG9zX2ltaWUgPC0gaWZlbHNlKGlzLm5hKG91dCRvc19pbWllKSwnJyxhcy5jaGFyYWN0ZXIob3V0JG9zX2ltaWUpKQ0Kb3V0JGZvX3N5bWJvbCA8LSBpZmVsc2UoaXMubmEob3V0JGZvX3N5bWJvbCksJycsYXMuY2hhcmFjdGVyKG91dCRmb19zeW1ib2wpKQ0Kb3V0JHphX29waXNfd3Nwb2x0d29yY293IDwtIGlmZWxzZShpcy5uYShvdXQkemFfb3Bpc193c3BvbHR3b3Jjb3cpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfb3Bpc193c3BvbHR3b3Jjb3cpKQ0Kb3V0JHphX3d5ZGFuaWUgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV93eWRhbmllKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3d5ZGFuaWUpKQ0Kb3V0JHphX3RvbXkgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV90b215KSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3RvbXkpKQ0Kb3V0JHphX2luc3R5dHVjamEgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9pbnN0eXR1Y2phKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX2luc3R5dHVjamEpKQ0Kb3V0JHd5X3d5ZGF3bmljdHdvX2lkIDwtIGlmZWxzZShpcy5uYShvdXQkd3lfd3lkYXduaWN0d29faWQpLCcnLGFzLmNoYXJhY3RlcihvdXQkd3lfd3lkYXduaWN0d29faWQpKQ0Kb3V0JHd5X21pZWpzY2UgPC0gaWZlbHNlKGlzLm5hKG91dCR3eV9taWVqc2NlKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHd5X21pZWpzY2UpKQ0Kb3V0JHd5X25hendhIDwtIGlmZWxzZShpcy5uYShvdXQkd3lfbmF6d2EpLCcnLGFzLmNoYXJhY3RlcihvdXQkd3lfbmF6d2EpKQ0Kb3V0JHphX3Jva193eWRhbmlhIDwtIGlmZWxzZShpcy5uYShvdXQkemFfcm9rX3d5ZGFuaWEpLCcnLGFzLmNoYXJhY3RlcihvdXQkemFfcm9rX3d5ZGFuaWEpKQ0Kb3V0JHphX29waXNfZml6eWN6bnlfa3NpYXpraSA8LSBpZmVsc2UoaXMubmEob3V0JHphX29waXNfZml6eWN6bnlfa3NpYXpraSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9vcGlzX2Zpenljem55X2tzaWF6a2kpKQ0Kb3V0JHphX3NlcmlhX3d5ZGF3bmljemEgPC0gaWZlbHNlKGlzLm5hKG91dCR6YV9zZXJpYV93eWRhd25pY3phKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHphX3NlcmlhX3d5ZGF3bmljemEpKQ0Kb3V0JHR3X25hendpc2tvIDwtIGlmZWxzZShpcy5uYShvdXQkdHdfbmF6d2lza28pLCcnLGFzLmNoYXJhY3RlcihvdXQkdHdfbmF6d2lza28pKQ0Kb3V0JHR3X2ltaWUgPC0gaWZlbHNlKGlzLm5hKG91dCR0d19pbWllKSwnJyxhcy5jaGFyYWN0ZXIob3V0JHR3X2ltaWUpKQ0Kb3V0JHByYWNvd25payA8LSBpZmVsc2UoaXMubmEob3V0JHByYWNvd25payksJycsYXMuY2hhcmFjdGVyKG91dCRwcmFjb3duaWspKQ0Kb3V0JHphX2Fkbm90YWNqZSA8LSBpZmVsc2UoaXMubmEob3V0JHphX2Fkbm90YWNqZSksJycsYXMuY2hhcmFjdGVyKG91dCR6YV9hZG5vdGFjamUpKQ0Kb3V0JEJOX1VSTCA8LSBpZmVsc2UoaXMubmEob3V0JEJOX1VSTCksJycsYXMuY2hhcmFjdGVyKG91dCRCTl9VUkwpKQ0KDQpvdXQgJSQlICANCiAgICB7IHJla29yZF9CTj09bGFnKHJla29yZF9CTiwpICYgcnpfbmF6d2E9PWxhZyhyel9uYXp3YSwpICYgemFfcm9fcm9rPT1sYWcoemFfcm9fcm9rLCkgJiB6YV90eXBlPT1sYWcoemFfdHlwZSwpICYgcnpfcm9kemFqX2lkPT1sYWcocnpfcm9kemFqX2lkLCkgJiBEWl9OQVpXQT09bGFnKERaX05BWldBLCkgJiBEWl9EWklBTF9JRD09bGFnKERaX0RaSUFMX0lELCkgJiB0d190d29yY2FfaWQ9PWxhZyh0d190d29yY2FfaWQsKSAmIHphX3R5dHVsPT1sYWcoemFfdHl0dWwsKSAmIHphX3R5dHVsX29yeWdpbmFsdT09bGFnKHphX3R5dHVsX29yeWdpbmFsdSwpICYgemFfamV6eWtfb3J5Z2luYWx1PT1sYWcoemFfamV6eWtfb3J5Z2luYWx1LCkgJiB6YV9vcGlzX3dzcG9sdHdvcmNvdz09bGFnKHphX29waXNfd3Nwb2x0d29yY293LCkgJiB6YV93eWRhbmllPT1sYWcoemFfd3lkYW5pZSwpICYgemFfdG9teT09bGFnKHphX3RvbXksKSAmIHphX2luc3R5dHVjamE9PWxhZyh6YV9pbnN0eXR1Y2phLCkgJiB6YV9yb2tfd3lkYW5pYT09bGFnKHphX3Jva193eWRhbmlhLCkgJiB6YV9vcGlzX2Zpenljem55X2tzaWF6a2k9PWxhZyh6YV9vcGlzX2Zpenljem55X2tzaWF6a2ksKSAmIHphX3NlcmlhX3d5ZGF3bmljemE9PWxhZyh6YV9zZXJpYV93eWRhd25pY3phLCkgJiB0d19uYXp3aXNrbz09bGFnKHR3X25hendpc2tvLCkgJiB0d19pbWllPT1sYWcodHdfaW1pZSwpICYgcHJhY293bmlrPT1sYWcocHJhY293bmlrLCkgJiB6YV9hZG5vdGFjamU9PWxhZyh6YV9hZG5vdGFjamUsKSAmIEJOX1VSTD09bGFnKEJOX1VSTCwpfSAlPiUgDQogICAgYXMubnVtZXJpYygpICU+JSANCiAgICB7Ln0gLT4gb3V0JHNhbWUNCm91dCRzYW1lWzFdIDwtIDANCm91dCRkemllbG9uZSA8LSBwYXN0ZShvdXQkYW1fYXV0b3JfaWQsb3V0JGFtX25hendpc2tvLG91dCRhbV9pbWllLG91dCRvc19vc29iYV9pZCxvdXQkb3NfbmF6d2lza28sb3V0JG9zX2ltaWUsb3V0JGZvX3N5bWJvbCxvdXQkd3lfd3lkYXduaWN0d29faWQsb3V0JHd5X21pZWpzY2Usb3V0JHd5X25hendhLHNlcCA9ICIiKQ0KDQpvdXQgPC0gb3V0ICU+JQ0KICBmaWx0ZXIoIShzYW1lPT0xJmR6aWVsb25lPT0iIikpICU+JQ0KICBzZWxlY3QoMTozMykNCg0Kb3V0ICUkJSAgDQogICAgeyByZWtvcmRfQk49PWxhZyhyZWtvcmRfQk4sKSAmIHJ6X25hendhPT1sYWcocnpfbmF6d2EsKSAmIHphX3JvX3Jvaz09bGFnKHphX3JvX3JvaywpICYgemFfdHlwZT09bGFnKHphX3R5cGUsKSAmIHJ6X3JvZHphal9pZD09bGFnKHJ6X3JvZHphal9pZCwpICYgRFpfTkFaV0E9PWxhZyhEWl9OQVpXQSwpICYgRFpfRFpJQUxfSUQ9PWxhZyhEWl9EWklBTF9JRCwpICYgdHdfdHdvcmNhX2lkPT1sYWcodHdfdHdvcmNhX2lkLCkgJiB6YV90eXR1bD09bGFnKHphX3R5dHVsLCkgJiB6YV90eXR1bF9vcnlnaW5hbHU9PWxhZyh6YV90eXR1bF9vcnlnaW5hbHUsKSAmIHphX2plenlrX29yeWdpbmFsdT09bGFnKHphX2plenlrX29yeWdpbmFsdSwpICYgemFfb3Bpc193c3BvbHR3b3Jjb3c9PWxhZyh6YV9vcGlzX3dzcG9sdHdvcmNvdywpICYgemFfd3lkYW5pZT09bGFnKHphX3d5ZGFuaWUsKSAmIHphX3RvbXk9PWxhZyh6YV90b215LCkgJiB6YV9pbnN0eXR1Y2phPT1sYWcoemFfaW5zdHl0dWNqYSwpICYgemFfcm9rX3d5ZGFuaWE9PWxhZyh6YV9yb2tfd3lkYW5pYSwpICYgemFfb3Bpc19maXp5Y3pueV9rc2lhemtpPT1sYWcoemFfb3Bpc19maXp5Y3pueV9rc2lhemtpLCkgJiB6YV9zZXJpYV93eWRhd25pY3phPT1sYWcoemFfc2VyaWFfd3lkYXduaWN6YSwpICYgdHdfbmF6d2lza289PWxhZyh0d19uYXp3aXNrbywpICYgdHdfaW1pZT09bGFnKHR3X2ltaWUsKSAmIHByYWNvd25paz09bGFnKHByYWNvd25paywpICYgemFfYWRub3RhY2plPT1sYWcoemFfYWRub3RhY2plLCkgJiBCTl9VUkw9PWxhZyhCTl9VUkwsKX0gJT4lIA0KICAgIGFzLm51bWVyaWMoKSAlPiUgDQogICAgey59IC0+IG91dCRzYW1lDQoNCiN1Y2nEmWNpZSB6Ynl0IGTFgnVnaWNoIGNpxIVnw7N3IHpuYWvDs3csIGJ5IHdlc3rFgnkgZG8gb3JhY2xlJ2ENCmRsdWdvc2NpIDwtIGRhdGEuZnJhbWUocG9sZSA9IGMoImFtX25hendpc2tvIiwgImFtX2ltaWUiLCAiemFfdHl0dWwiLCAiemFfdHl0dWxfb3J5Z2luYWx1IiwgInphX2plenlrX29yeWdpbmFsdSIsICJvc19uYXp3aXNrbyIsICJvc19pbWllIiwgInphX29waXNfd3Nwb2x0d29yY293IiwgInphX2luc3R5dHVjamEiLCAid3lfbWllanNjZSIsICJ3eV9uYXp3YSIsICJ6YV9vcGlzX2Zpenljem55X2tzaWF6a2kiLCAiemFfc2VyaWFfd3lkYXduaWN6YSIsICJ0d19uYXp3aXNrbyIsICJ0d19pbWllIiwgInphX2Fkbm90YWNqZSIpLCBsaWN6YmFfem5ha293ID0gYyg1MCw0MCw1MDAsNTAwLDEwMCw1MCw0MCw1MDAsMjU1LDQwLDI1NSwxMDAwLDI1NSwyMDAsNDAsMjAwMCkpDQp4IDwtIG1hdGNoKGRsdWdvc2NpJHBvbGUsbmFtZXMob3V0KSkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgZGx1Z29zYyA8LSBkbHVnb3NjaSRsaWN6YmFfem5ha293W21hdGNoKG5hbWVzKG91dFtpXSksZGx1Z29zY2kkcG9sZSldDQogIG91dCR6YV9hZG5vdGFjamUgPC0gaWZlbHNlKGRsdWdvc2M8bmNoYXIoYXMuY2hhcmFjdGVyKG91dFssaV0pKSZvdXQkemFfYWRub3RhY2plIT0iIixwYXN0ZShvdXQkemFfYWRub3RhY2plLHBhc3RlKCJVV0FHQSEgUG9sZSAiLGFzLmNoYXJhY3RlcihuYW1lcyhvdXRbaV0pKSwiIGJ5xYJvIHpieXQgZMWCdWdpZSBpIHpvc3RhxYJvIHByenljacSZdGUuIFpyZWRhZ3VqIHRyZcWbxIcgcG9sYS4iLHNlcCA9ICIiKSxzZXAgPSAiIyAiKSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKGRsdWdvc2M8bmNoYXIoYXMuY2hhcmFjdGVyKG91dFssaV0pKSZvdXQkemFfYWRub3RhY2plPT0iIixwYXN0ZSgiVVdBR0EhIFBvbGUgIixhcy5jaGFyYWN0ZXIobmFtZXMob3V0W2ldKSksIiBiecWCbyB6Ynl0IGTFgnVnaWUgaSB6b3N0YcWCbyBwcnp5Y2nEmXRlLiBacmVkYWd1aiB0cmXFm8SHIHBvbGEuIixzZXAgPSAiIiksYXMuY2hhcmFjdGVyKG91dCR6YV9hZG5vdGFjamUpKSkNCiAgDQogIG91dFssaV0gPC0gaWZlbHNlKGRsdWdvc2M8bmNoYXIoYXMuY2hhcmFjdGVyKG91dFssaV0pKSxhcy5jaGFyYWN0ZXIoc3Vic3RyKG91dFssaV0sMSxkbHVnb3NjKSksYXMuY2hhcmFjdGVyKG91dFssaV0pKQ0KfQ0KDQpvdXQkcmVrb3JkX0JOW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkcnpfbmF6d2Fbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9yb19yb2tbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV90eXBlW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkcnpfcm9kemFqX2lkW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkRFpfTkFaV0Fbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCREWl9EWklBTF9JRFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHR3X3R3b3JjYV9pZFtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3R5dHVsW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfdHl0dWxfb3J5Z2luYWx1W291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfamV6eWtfb3J5Z2luYWx1W291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfb3Bpc193c3BvbHR3b3Jjb3dbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV93eWRhbmllW291dCRzYW1lID09IDFdIDwtICIiDQpvdXQkemFfdG9teVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX2luc3R5dHVjamFbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9yb2tfd3lkYW5pYVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX29waXNfZml6eWN6bnlfa3NpYXpraVtvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHphX3NlcmlhX3d5ZGF3bmljemFbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR0d19uYXp3aXNrb1tvdXQkc2FtZSA9PSAxXSA8LSAiIg0Kb3V0JHR3X2ltaWVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCRwcmFjb3duaWtbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCR6YV9hZG5vdGFjamVbb3V0JHNhbWUgPT0gMV0gPC0gIiINCm91dCRCTl9VUkxbb3V0JHNhbWUgPT0gMV0gPC0gIiINCg0Kb3V0IDwtIG91dCAlPiUNCiAgc2VsZWN0KDE6MzMpDQoNCiNwxJl0bGEgemFwaXN1asSFY2EgcG8gb2suIDIwMDAgd2llcnN6eSB6IHV3emdsxJlkbmllbmllbSBrb21wbGV0bm/Fm2NpIHJla29yZMOzdyBiaWJsaW9ncmFmaWN6bnljaCByb3pwaXNhbnljaCBuYSBraWxrYSB3aWVyc3p5DQpvdXQgPC0gb3V0ICU+JQ0KICBtdXRhdGUocG9kemlhbCA9IGlmZWxzZShyZWtvcmRfQk4hPSIiLGFzLmNoYXJhY3RlcihyZWtvcmRfQk4pLE5BKSkgJT4lDQogIGZpbGwocG9kemlhbCkNCmlsZSA8LSB1bmlxdWUob3V0JHBvZHppYWwpDQppbGUgPC0gc3BsaXQodW5pcXVlKGlsZSksIGNlaWxpbmcoc2VxX2Fsb25nKHVuaXF1ZShpbGUpKS8xNTAwKSkNCnggPC0gMTpsZW5ndGgoaWxlKQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKQ0KICBmaW5hbCA8LSBvdXQgJT4lDQogICAgZmlsdGVyKHBvZHppYWwgJWluJSBpbGVbW2ldXSkgJT4lDQogICAgc2VsZWN0KC1wb2R6aWFsKQ0KICB3cml0ZS54bHN4KGZpbmFsLCBwYXN0ZSgiQzovVXNlcnMvIixlbXBsb3llZV9uYW1lLCIvRGVza3RvcC8iLGltcG9ydF95ZWFyLCJfd3Nwb2x3eWRhbmllX2RvX2ltcG9ydHUiLGksIi54bHN4IixzZXAgPSAiIiksc2hlZXROYW1lID0gImdvdG93ZSIpDQp9DQpgYGANCg0KYmV6cGllY3puaWsNClVXQUdBIQ0KTmFqcGllcncgbmFsZcW8eSBwcnplcHJvd2FkemnEhyBpbXBvcnQgZG8gYmF6eSwgYSBuYXN0xJlwbmllIGVnemVrd293YcSHIHBvbmnFvHN6xIUgY3rEmcWbxIcga29kdQ0KDQpgYGB7ciByxJljem5hIGtvcmVrdGEgaW1wb3J0dX0NCiN3IGZvcm11bGFyenUga3NpxIXFvGtvd3ltIHd5c3p1a2FqIHcgcG9sdSB1d2FnIGZyYXrEmSAnJWFrY2VwdHVqZTpOQSUnIGkgLSBqZcWbbGkgdGFrb3dhIHd5c3TEhXBpIC0gemFzdMSFcCBOQSBpbWllbmllbSB3xYJhxZtjaXdlZ28gcHJhY293bmlrYQ0KI3dpZW0sIMW8ZSB0byBza2Fzb3dhbGnFm215LCBhbGUgZG9zemVkxYJlbSBkbyB3bmlvc2t1LCDFvGUgamVkbmFrIHdhcnRvIHRvIHNwcmF3ZHppxIcNCmBgYA0KDQoNCmBgYHtyIHByenlnb3Rvd2FuaWUgcGxpa8OzdyBkbyBtYXNvd2VnbyBuYWRwaXNhbmlhIHN0YXR1c3UgSU9LfQ0KI2F1dG9tYXR5Y3pueSBJT0sgZGxhIHJla29yZMOzdyBiaWJsaW9ncmFmaWN6bnljaA0KDQpuYWRwaXNhbmllX3phcGlzb3dfSU9LIDwtIHJlYWQuY3N2MihwYXN0ZSgiQzovVXNlcnMvIixlbXBsb3llZV9uYW1lLCIvRGVza3RvcC9pbXBfIixpbXBvcnRfeWVhciwiX2F1dG9tYXR5Y3puZV9wb2RtaW90b3dlLmNzdiIsc2VwID0gIiIpLCBlbmNvZGluZyA9ICJVVEYtOCIsIGhlYWRlciA9IFRSVUUsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkNCg0KbmFkcGlzYW5pZV96YXBpc293X0lPSyA8LSBuYWRwaXNhbmllX3phcGlzb3dfSU9LICU+JQ0KICBtdXRhdGUocmVrb3JkX0JOID0gYXMuY2hhcmFjdGVyKHJla29yZF9CTikpICU+JSANCiAgbGVmdF9qb2luKC4sZGJHZXRRdWVyeShQQkwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3Qgei56YV96YXBpc19pZCwgei56YV9zdGF0dXNfaW1wLCB6LnphX3V3YWdpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHBibF96YXBpc3kgeg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgemFfdXdhZ2kgbGlrZSAnQk46ICUnDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgei56YV91cmxfYm4gaXMgbm90IG51bGwiKSAlPiUgbXV0YXRlKFpBX1VXQUdJID0gc3RyX2V4dHJhY3QoWkFfVVdBR0ksIig/PD1CTjogKSguKj8pKD89LCBpbXBvcnQpIikpLGJ5PWMoInJla29yZF9CTiI9IlpBX1VXQUdJIikpICU+JQ0KICAjZmlsdGVyKGdyZXBsKHBhc3RlKCJeQk5cXDogIixpbXBvcnRfeWVhciwgc2VwID0gIiIpLHJla29yZF9CTikpICU+JSANCiAgcmVuYW1lKGplc3QgPSBaQV9TVEFUVVNfSU1QKSAlPiUgDQogIG11dGF0ZShJRDIgPSBOQSkgJT4lIA0KICBzZWxlY3QoWkFfWkFQSVNfSUQsSUQyLGplc3QscG93aW5ub19ieWMpDQoNCndyaXRlLnhsc3gobmFkcGlzYW5pZV96YXBpc293X0lPSywgcGFzdGUoIkM6L1VzZXJzLyIsZW1wbG95ZWVfbmFtZSwiL0Rlc2t0b3AvIixpbXBvcnRfeWVhciwiX25hZHBpc2FuaWVfemFwaXNvd19JT0sueGxzeCIsc2VwID0gIiIpLHNoZWV0TmFtZSA9ICJaQV9TVEFUVVNfSU1QIikNCg0KI2JlenBpZWN6bmlrDQojYXV0b21hdHljem55IElPSyBkbGEgbm93eWNoIHR3w7NyY8OzdyB3IGthcnRvdGVjZSBwb3dpbmllbiB6b3N0YcSHIHByemVwcm93YWR6b255IHogcG96aW9tdSBpbXBvcnRlcmENCg0KI2F1dG9tYXR5Y3puaWUgbmFkcGlzYcSHIHJla29yZHkgYmlibGlvZ3JhZmljem5lIGkga2FydG90ZWN6bmUgcHJ6ZWQga29sZWpueW0ga3Jva2llbQ0KDQojYmV6cGllY3puaWsNCiNqZcWbbGkgcG9kY3phcyBpbXBvcnR1IG5pZSBkYSBzacSZIHphaW1wb3J0b3dhxIcgcmVrb3Jkw7N3IC0gd3Byb3dhZMW6IGplIHLEmWN6bmllIHcgdHltIG1vbWVuY2llDQoja29sdW1uxJkgQk4tVVJMIG5hbGXFvHkgbmFkcGlzYcSHIGF1dG9tYXR5Y3puaWUNCmBgYA0KDQpgYGB7ciBwcnp5Z290b3dhbmllIGxpc3QgcHJhY293bmlrw7N3fQ0KI2RvY2Vsb3dvIHByenlnb3Rvd3VqZW15IHBsaWsgb2QgcmF6dSBuYSBkeXNrLCBhbGUgbmEgcmF6aWUgeGxzeCBkbyB3Z3JhbmlhIG5hIGR5c2sgKGJyYWsgZnVua2Nqb25hbG5vxZtjaSBnb29nbGVzaGVldHM0KQ0KI3BvIHR5bSBwcnp5Z290b3dhxIcgbmEgZHlza3UgdW5pa2F0b3dlIGxpbmtpDQpibl9vayA8LSBjaHVuazExDQprb2xlam5vc2MgPC0gYygicHJhY293bmlrIiwiWkFfWkFQSVNfSUQiLCJ0eXBfa3NpYXpraSIsImxpbmsiLCJsaW5rXzEiLCJyb2siLCJzdGF0dXMiLCJibGFkX3dfaW1wb3JjaWVfdHl0dWx1IiwiWDEwMCIsIlgyNDUiLCJYNjUwIiwiWDY1NSIsIlgyNDYiLCJYMjUwIiwiWDI2MCIsIlgzMDAiLCJYMzgwIiwiWDQ5MCIsIlg1MDAiLCJYNTAxIiwiWDU0NiIsIlg2MDAiLCJYNzAwIiwiWDA0MSIsIlgwODAiKQ0KDQpyb2N6bmlrX3BibF9wb19pbXBvcmNpZSA8LSBkYkdldFF1ZXJ5KFBCTCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3Qgei56YV96YXBpc19pZCwgei56YV9zdGF0dXNfaW1wLCB6LnphX3V3YWdpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBwYmxfemFwaXN5IHoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB6YV91d2FnaSBsaWtlICdCTjogJScNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgei56YV91cmxfYm4gaXMgbm90IG51bGwiKSAlPiUgDQogIGZpbHRlcihncmVwbChwYXN0ZSgiXkJOXFw6ICIsaW1wb3J0X3llYXIsIHNlcCA9ICIiKSxaQV9VV0FHSSkpICU+JSANCiAgbXV0YXRlKFpBX1VXQUdJID0gc3RyX2V4dHJhY3QoWkFfVVdBR0ksIig/PD1CTjogKSguKj8pKD89LCBpbXBvcnQpIikpICU+JQ0KICByZW5hbWUoc3RhdHVzID0gWkFfU1RBVFVTX0lNUCkgJT4lIA0KICBsZWZ0X2pvaW4oLixibl9vayAlPiUgc2VsZWN0KHByYWNvd25payA9IHJlZGFrdG9yX2R6aWFsdSx0eXBfa3NpYXpraSA9IHJvZHphal9rc2lhemtpLGxpbmsgPSBCTl9VUkwsIHJvaywgWDEwMCwgWDI0NSwgWDY1MCwgWDY1NSwgWDI0NiwgWDI1MCwgWDI2MCwgWDMwMCwgWDM4MCwgWDQ5MCwgWDUwMCwgWDUwMSwgWDU0NiwgWDYwMCwgWDcwMCwgWDA0MSwgWDA4MCxaQV9VV0FHSSkgJT4lIG11dGF0ZShsaW5rXzEgPSBwYXN0ZSgiPUhZUEVSTElOSyhcIiIsbGluaywiXCI7XCJsaW5rIGRvIGtzacSFxbxraSB3IEJOXCIpIixzZXAgPSAiIiksIGJsYWRfd19pbXBvcmNpZV90eXR1bHUgPSBGQUxTRSksYnk9IlpBX1VXQUdJIikgJT4lIA0KICBzZWxlY3Qobm9xdW90ZShrb2xlam5vc2MpKQ0Kcm9jem5pa19wYmxfcG9faW1wb3JjaWUkcHJhY293bmlrW3JvY3puaWtfcGJsX3BvX2ltcG9yY2llJHN0YXR1cz09IklPSyJdIDwtICJBVVRPTUFUIg0KDQp3cml0ZS54bHN4KHJvY3puaWtfcGJsX3BvX2ltcG9yY2llLCBwYXN0ZSgiQzovVXNlcnMvIixlbXBsb3llZV9uYW1lLCIvRGVza3RvcC9rc19CTl8iLGltcG9ydF95ZWFyLCJfbGlzdHlfcHJhY293bmlrw7N3Lnhsc3giLHNlcCA9ICIiKSxzaGVldE5hbWUgPSAibGlzdGFfa3NpYXplayIpDQojdXR3w7NyeiBub3d5IHBvZGZvbGRlciB3IGZvbGRlcnplIGltcG9ydHUgQk4gaSBwcnplxZtsaWogbGlzdMSZIG5hIGR5c2ssIHByenlnb3R1aiB3aWRva2kgZmlsdHLDs3cgZGxhIHdzenlzdGtpY2ggb3PDs2IgaSByb3plxZtsaWogdW5pa2F0b3dlIGxpbmtpDQpgYGANCg0KYGBge3IgYWt0dWFsaXphY2phIHJlbGFjamkgb3PDs2IgUEJMLUJOfQ0KI1RVVEFKIC0genJvYmnEhyBkb3BpZXJvIHBvIGltcG9yY2llISEhDQojYmF6b3dhxIcgbmEgYm5fb2sgeiB6YXB5dGFuaWVtIFNRTCBkemnEmWtpIHphd2FydG/Fm2NpIHBvbGEgYm4gcmVrb3JkDQojemFrdHVhbGl6b3dhxIcgcGxpayBuYSBkeXNrdTogIm1hcG93YW5pZV9vc29iX2JuX3BibF9wb19pbXBvcmNpZSIgbyBub3dlIHJlbGFjamUgb3NvYm93ZSBwYmwtYm4NCmJuX29rIDwtIGNodW5rMTENCm5vd2VfcmVsYWNqZSA8LSBibl9vayAlPiUgDQogIGZpbHRlcihpcy5uYShUV19UV09SQ0FfSUQpJiFpcy5uYShUV19OQVpXSVNLTykpICU+JSANCiAgc2VsZWN0KFgxMDAsVFdfTkFaV0lTS08sVFdfSU1JRSkgJT4lIA0KICBmaWx0ZXIoIWdyZXBsKCJcXHwiLFgxMDApKSAlPiUgDQogIHVuaXF1ZSgpICU+JSANCiAgbXV0YXRlKGxpY3puaWsgPSAxOm5yb3coLikpDQoNCm1hcmNfZmllbGRfMTAwIDwtIG5vd2VfcmVsYWNqZSAlPiUNCiAgc2VsZWN0KGxpY3puaWssWDEwMCklPiUNCiAgZmlsdGVyKFgxMDAhPSIiKSAlPiUNCiAgbXV0YXRlKFgxMDA9c3RyX3JlbW92ZV9hbGwoWDEwMCwiXlxcfCIpKSAlPiUNCiAgbXV0YXRlKGluZGljYXRvciA9IHN0cl9yZXBsYWNlX2FsbChYMTAwLCIoXi4qPykoXFwkLiopIiwiXFwxIikpDQpzdWJmaWVsZF9saXN0PC0gc3RyX2V4dHJhY3RfYWxsKG5vd2VfcmVsYWNqZSRYMTAwLCJcXCQuIikNCnN1YmZpZWxkX2xpc3Q8LSB1bmlxdWUodW5saXN0KHN1YmZpZWxkX2xpc3QpKQ0KZW1wdHlfdGFibGU8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gbGVuZ3RoKHN1YmZpZWxkX2xpc3QpLG5yb3cgPSBsZW5ndGhzKG1hcmNfZmllbGRfMTAwKVsxXSkpDQpjb2xuYW1lcyhlbXB0eV90YWJsZSkgPC1zdWJmaWVsZF9saXN0DQptYXJjX2ZpZWxkXzEwMDwtY2JpbmQobWFyY19maWVsZF8xMDAsZW1wdHlfdGFibGUpDQpzdWJmaWVsZF9saXN0X2NoYXIgPC0gcGFzdGUoIigiLHN1YmZpZWxkX2xpc3QsIikiLHNlcCA9ICIiKQ0Kc3ViZmllbGRfbGlzdF9jaGFyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0X2NoYXIsIlxcJCIsIlxcXFwkIikNCg0KeCA8LSAxOmxlbmd0aChzdWJmaWVsZF9saXN0KQ0KZm9yIChpIGluIHgpIHsNCiAgcHJvZ3Jlc3MobWF0Y2goaSx4KSwgbWF4LnZhbHVlID0gbGVuZ3RoKHgpKSANCiAgbWFyY19maWVsZF8xMDAkWDEwMCA8LSBzdHJfcmVwbGFjZShtYXJjX2ZpZWxkXzEwMCRYMTAwLHN1YmZpZWxkX2xpc3RfY2hhcltpXSwifFxcMSIpDQp9DQpmb3IgKGkgaW4geCkgew0KICBwcm9ncmVzcyhtYXRjaChpLHgpLCBtYXgudmFsdWUgPSBsZW5ndGgoeCkpIA0KICBzdWJmaWVsZF9saXN0X2NoYXIyIDwtIHN0cl9yZXBsYWNlX2FsbChzdWJmaWVsZF9saXN0LCJcXCQiLCJcXFxcJCIpDQogIHN0cmluZ19hIDwtICIoXikoLio/XFx8Ig0KICBzdHJpbmdfYiA8LSBzdWJmaWVsZF9saXN0X2NoYXIyW2ldDQogIHN0cmluZ19jIDwtICIpKC4qPykoXFwsezAsMX0pKChcXHxcXCQpKC4qKXwkKSINCiAgc3RyaW5nIDwtIHBhc3RlKHN0cmluZ19hLHN0cmluZ19iLHN0cmluZ19jLHNlcCA9ICIiKQ0KICBtYXJjX2ZpZWxkXzEwMFssaSszXSA8LSBpZmVsc2UoZ3JlcGwoc3ViZmllbGRfbGlzdF9jaGFyMltpXSxtYXJjX2ZpZWxkXzEwMCRYMTAwKSxzdHJfcmVwbGFjZV9hbGwoZ3N1YihzdHJpbmcsIlxcMyIsbWFyY19maWVsZF8xMDAkWDEwMCksIlxcJHsyfS4iLCAifiIpLE5BKQ0KfQ0KDQpub3dlX3JlbGFjamUgPC0gbm93ZV9yZWxhY2plICU+JSANCiAgbGVmdF9qb2luKC4sbWFyY19maWVsZF8xMDAgJT4lIHVuaXRlKCJCTl9vc29iYSIsYCRhYDpgJGNgLHNlcCA9ICIgIixuYS5ybSA9IFRSVUUpICU+JSBzZWxlY3QobGljem5payxCTl9vc29iYSksYnk9ImxpY3puaWsiKSAlPiUgDQogIGxlZnRfam9pbiguLGRiR2V0UXVlcnkoUEJMLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IHR3LnR3X3R3b3JjYV9pZCx0dy50d19uYXp3aXNrbyx0dy50d19pbWllDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHBibF90d29yY3kgdHciKSxieT1jKCJUV19OQVpXSVNLTyIsIlRXX0lNSUUiKSkgJT4lDQogIHNlbGVjdChUV19UV09SQ0FfSUQsVFdfTkFaV0lTS08sVFdfSU1JRSxCTl9vc29iYSkNCg0KcGJsX2JuX2ltcG9ydCA8LSBkYXRhLmZyYW1lKHN0cmluZ3NBc0ZhY3RvcnM9RkFMU0UpDQp4IDwtIDE6bGVuZ3RoKG5vd2VfcmVsYWNqZSRUV19UV09SQ0FfSUQpDQoNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkgDQogIHRyeUNhdGNoKHsgDQogIGlkIDwtIGpzb25saXRlOjpmcm9tSlNPTihzdHJfcmVwbGFjZV9hbGwocGFzdGUoImh0dHBzOi8vZGF0YS5ibi5vcmcucGwvYXBpL2F1dGhvcml0aWVzLmpzb24/bGltaXQ9MTAwJm5hbWU9Iixub3dlX3JlbGFjamUkQk5fb3NvYmFbaV0sc2VwID0gIiIpLCIgIiwiJTIwIikpICU+JSAuJGF1dGhvcml0aWVzICU+JSANCiAgICBmaWx0ZXIodGl0bGU9PSIiKSAlPiUgLiRpZA0KICBpZiAobGVuZ3RoKGlkKT09MCkgew0KICAgIGlkIDwtICJicmFrIGRhbnljaCAoQ1IpIg0KICB9IA0KICB9LCBlcnJvcj1mdW5jdGlvbihlKXsNCiAgICAgICAgICAgICAgICAgICAgIGlkIDw8LSAiYnJhayBkYW55Y2ggKENSKSINCiAgfSkNCiAgaXRlcmF0aW9uIDwtIGRhdGEuZnJhbWUobm93ZV9yZWxhY2plICU+JSBzZWxlY3QoMTo0KSAlPiUgc2xpY2UoaSksIGlkID0gaWQpDQogIHBibF9ibl9pbXBvcnQgPC0gcmJpbmQocGJsX2JuX2ltcG9ydCxpdGVyYXRpb24pDQp9DQoNCnBibF9ibl9pbXBvcnRfZml4IDwtIHBibF9ibl9pbXBvcnQgJT4lIA0KICBmaWx0ZXIoaWQ9PSJicmFrIGRhbnljaCAoQ1IpIikNCnBibF9ibl9pbXBvcnQgPC0gcGJsX2JuX2ltcG9ydCAlPiUgDQogIGZpbHRlcihpZCAlbm90aW4lIHBibF9ibl9pbXBvcnRfZml4JGlkKQ0KI2FrdHVhbGl6YWNqYSAtIHLEmWN6bmllIHV6dXBlxYJuaWogaWRlbnR5ZmlrYXRvcnkgZGxhIG9zw7NiIEJOLCBrdMOzcmUgbmllIHpvc3RhxYJ5IHpuYWxlemlvbmUgYXV0b21hdHljem5pZSAoc3p1a2FqIHByenkgdcW8eWNpdS96IHd5a2x1Y3plbmllbSB6bmFrw7N3IGRpYWtyeXR5Y3pueWNoLCBwbyBmcmFnbWVudGFjaCBzdHJpbmfDs3cpDQojc3p1a2FqIHcgc2NoZW1hY2llOmh0dHA6Ly9kYXRhLmJuLm9yZy5wbC9hcGkvYXV0aG9yaXRpZXMuanNvbj9saW1pdD0xMDAmbmFtZT1LYXJsJTIwT3ZlJTIwKDE5NjgtJTIwKSBwb2RtaWVuaWFqxIVjIHdhcnRvxZtjaSBwbyAibmFtZT0iDQojIGplxZtsaSBuaWVtbyB6bGl3ZSBqZXN0IHVzdGFsZW5pZSBpZCB3IG9iaWVrY2llIHJlY3puZV91enVwZWxuaWVuaWUgdyBvZHBvd2llZG5pbSBtaWVqc2N1IHdzdGF3IGZyYXrEmSAiYnJhayBkYW55Y2ggKENSKSINCnJlY3puZV91enVwZWxuaWVuaWUgPC0gYygyNzY1OTI5LCAzNjQ5OTc3LCAyNzg2ODEwLCAyNjA1NTIwLCAzNjg5NzY2LCAyODIzMTcxLCAyNzkyNTU2LCAyNzY2OTk0LCAyNjM0MzI0LCAzNTkyMDY0LCAzNTg1NTgwLCAzNjEzNzc0LCAyNjk2NDA4LCAzODQ3MjAyLCAxOTcxMzAxLCAyNjkxMzgwLCAzNDM3MDE3LCAxMTc0NTg1LCAxMDY5MDY1LCAzNTgyNjcyLCAyNzY4ODQxLCAzNzk0MTQ5LCAyNjQ2MTI0LCAyNjU0MjA4LCAzNzM3MzIyLCAzNjcxNDMwLCAyNTU3NzQzLCAyMjgxMTQ4LCAzNjg4OTEyLCAyMzE5OTI0LCAyMjUzNDIyLCAyOTgxNDI2LCAyNTA2MzE2LCAyNjcwMDUwLCAyNzc3Nzk1LCAzNjg5Mzk0LCAxMTA0NDA2LCAzNjkwNzk0LCAyNTkzMjAzLCAyNjAzMjUwLCAzNDI4OTc4LCAyNjQ3OTY4LCAzNzQ1OTE5LCAxOTEzNTQzLCAyNjcyODU4LCAyNjU3MzYwLCAzNDg4MjA1LCAzNjg5MjE5LCAyNjczMTI3LCAzNzQyODk4LCAxMTEzODQyLCAyODM4NTU0LCAyNTcxMjEzLCAzMDgwMTQzLCAyOTU0MjI5LCAzMDcwNzY1LCAxMjYzMDQ4LCAxMTEyODc5LCAzNzMxMzAwLCAzNjQzODE1LCAyNjg5NjcxLCAyNjE4NTc5LCAyODIxNTM0LCAyNjM4MTM5LCAyNjcxMzM5LCAxODM0ODQxLCAyNzE4MjgxLCAyNTk3NzA5LCAyOTgxMzE5LCAyNjg0MjIyLCAyMzExODI2LCAyNzUyMjM5LCAzNzE4MTM0LCAyNzkyNjUzLCAyNjg2OTAxLCAyNjQyMzMxLCAzODM1ODA5LCAyNjE3NTY0LCAzNjg5MTY2LCAyODY2Njc5LCAyODQ1OTg3LCAzNjg4OTI2LCAzNzE2NDk5LCAyNjM2MTIzLCAyNjgyNDQ3LCAzNTc4NDc5LCAzNjQxMTQ0LCAyNzE4Mjc0LCAzNjY5OTU4LCAzNzE4MTU2LCAzNzY4ODUwLCAzNjEzNjgzLCAzNzE5MzM3LCAzMjYwNDk0LCAyNjYwMDg3LCAzNjg5NjEyLCAyMTc2NTQ1LCAxNjgzNDc3LCAzNjI2MzUyLCAiYnJhayBkYW55Y2ggKENSKSIsICJicmFrIGRhbnljaCAoQ1IpIiwgImJyYWsgZGFueWNoIChDUikiLCAiYnJhayBkYW55Y2ggKENSKSIsIDEwMDAwMDAwMjg2NjMsICJicmFrIGRhbnljaCAoQ1IpIiwgMzA2NTEzMywgImJyYWsgZGFueWNoIChDUikiLCAiYnJhayBkYW55Y2ggKENSKSIsIDMwOTI5OTAsIDI1ODg5NzksIDMwMTA0NTMsIDI2MDk3NTQsIDI0MzE1MzEsIDI2NjA4MTUsIDExODcwNTksIDI3OTQwNDAsIDI3ODY3MTEpDQpwYmxfYm5faW1wb3J0X2ZpeCRpZCA8LSByZWN6bmVfdXp1cGVsbmllbmllDQpwYmxfYm5faW1wb3J0IDwtIHBibF9ibl9pbXBvcnQgJT4lIA0KICBiaW5kX3Jvd3MocGJsX2JuX2ltcG9ydF9maXggJT4lIGZpbHRlcihpZCAhPSAiYnJhayBkYW55Y2ggKENSKSIpKQ0KDQpwYmxfYm5fdmlhZl9pbXBvcnQgPC0gZGF0YS5mcmFtZShzdHJpbmdzQXNGYWN0b3JzPUZBTFNFKQ0KeCA8LSAxOmxlbmd0aChwYmxfYm5faW1wb3J0JFRXX1RXT1JDQV9JRCkNCmZvciAoaSBpbiB4KSB7DQogIHByb2dyZXNzKG1hdGNoKGkseCksIG1heC52YWx1ZSA9IGxlbmd0aCh4KSkNCiAgbmFtZSA8LSBwYXN0ZShzdHJfcmVwbGFjZV9hbGwoc3RyX3JlbW92ZV9hbGwocGFzdGUodW5saXN0KGpzb25saXRlOjpmcm9tSlNPTihwYXN0ZSgiaHR0cHM6Ly9kYXRhLmJuLm9yZy5wbC9hcGkvYXV0aG9yaXRpZXMuanNvbj9pZD0iLHBibF9ibl9pbXBvcnQkaWRbaV0sc2VwID0gIiIpKSAlPiUgLiRhdXRob3JpdGllcyAlPiUgLiRtYXJjICU+JSAuJGZpZWxkcyAlPiUgYFtbYCgxKSAlPiUgLiRgMTAwYCAlPiUgYFtbYCgzKSksY29sbGFwc2UgPSAifCIpLCJcXHxOQSIpLCIoXFx8KShcXChcXGQrKSIsIiBcXDIiKSxzdHJfcmVwbGFjZV9hbGwoc3RyX3JlbW92ZV9hbGwocGFzdGUodW5saXN0KGpzb25saXRlOjpmcm9tSlNPTihwYXN0ZSgiaHR0cHM6Ly9kYXRhLmJuLm9yZy5wbC9hcGkvYXV0aG9yaXRpZXMuanNvbj9pZD0iLHBibF9ibl9pbXBvcnQkaWRbaV0sc2VwID0gIiIpKSAlPiUgLiRhdXRob3JpdGllcyAlPiUgLiRtYXJjICU+JSAuJGZpZWxkcyAlPiUgYFtbYCgxKSAlPiUgLiRgNDAwYCAlPiUgYFtbYCgzKSksY29sbGFwc2UgPSAifCIpLCJcXHxOQSIpLCIoXFx8KShcXChcXC4rKSIsIiBcXDIiKSxzZXAgPSAifCIpDQogIHZpYWYgPC0gc3RyX3JlbW92ZV9hbGwocGFzdGUodW5saXN0KGpzb25saXRlOjpmcm9tSlNPTihwYXN0ZSgiaHR0cHM6Ly9kYXRhLmJuLm9yZy5wbC9hcGkvYXV0aG9yaXRpZXMuanNvbj9pZD0iLHBibF9ibl9pbXBvcnQkaWRbaV0sc2VwID0gIiIpKSAlPiUgLiRhdXRob3JpdGllcyAlPiUgLiRtYXJjICU+JSAuJGZpZWxkcyAlPiUgYFtbYCgxKSAlPiUgLiRgMDI0YCAlPiUgLiRzdWJmaWVsZHMpLGNvbGxhcHNlID0gInwiKSwiKFxcfE5BKXwoXFx8dmlhZikiKQ0KICBpdGVyYXRpb24gPC0gZGF0YS5mcmFtZShwYmxfYm5faW1wb3J0ICU+JSBzZWxlY3QoMTozLDUpICU+JSBzbGljZShpKSwgbmFtZSA9IG5hbWUsIHZpYWYgPSB2aWFmKQ0KICBwYmxfYm5fdmlhZl9pbXBvcnQgPC0gcmJpbmQocGJsX2JuX3ZpYWZfaW1wb3J0LGl0ZXJhdGlvbikNCn0NCg0KcGJsX2JuX3ZpYWZfaW1wb3J0IDwtIHBibF9ibl92aWFmX2ltcG9ydCAlPiUgDQogIHJlbmFtZShwYmxfaWQgPSBUV19UV09SQ0FfSUQsDQogICAgICAgICBwYmxfbmF6d2lza28gPSBUV19OQVpXSVNLTywNCiAgICAgICAgIHBibF9pbWllID0gVFdfSU1JRSwNCiAgICAgICAgIEJOX2lkID0gaWQsDQogICAgICAgICBCTl9uYW1lID0gbmFtZSkgJT4lIA0KICBtdXRhdGUoY3p5X3Rlbl9zYW0gPSAidGFrIikgJT4lIA0KICBzZWxlY3QocGJsX2lkLHBibF9uYXp3aXNrbyxwYmxfaW1pZSxCTl9pZCxCTl9uYW1lLGN6eV90ZW5fc2FtLHZpYWYpICU+JSANCiAgdW5pcXVlKCkNCg0KI3phcGlzYcSHIHBsaWsgaSBqZWdvIHRyZcWbxIcgd2tsZWnEhyBuYSBkeXNrIGRvIHRhYmVsaSAibWFwb3dhbmllX29zb2JfYm5fcGJsX3BvX2ltcG9yY2llIg0Kd3JpdGUueGxzeChwYmxfYm5fdmlhZl9pbXBvcnQsIHBhc3RlKCJDOi9Vc2Vycy8iLGVtcGxveWVlX25hbWUsIi9EZXNrdG9wL3JlbGFjamVfb3NvYm93ZV9wYmxfYm4ueGxzeCIsc2VwID0gIiIpLHNoZWV0TmFtZSA9ICJwYmwtYm4iKQ0KI25hc3TEmXBuaWUgcHJ6ZWFuYWxpem93YcSHIHphd2FydG/Fm8SHIHdrZWpvbmVqIGN6xJnFm2NpIGkgem9zdGF3acSHICJ0YWsiIHcga29sdW1uaWUgRiB0eWxrbyBkbGEgcG9wcmF3bnljaCB1dG/FvHNhbWllxYQgKG9zb2JhIHcgUEJMIHRvIG9zb2JhIHcgQk4pDQpgYGANCg0K